Added a builder from a request

This commit is contained in:
Marcin Grzejszczak
2020-09-15 16:56:30 +02:00
committed by Marcin Grzejszczak
parent bd4c01a5d8
commit d2d38cf51a
2 changed files with 136 additions and 4 deletions

View File

@@ -142,11 +142,36 @@ public class Request {
return new Request.MethodBuilder();
}
/**
* @param request from which a builder will be built
* @return a builder with request data filled in
*/
public static Request.Builder from(Request request) {
return new MethodBuilder()
.method(request.method.getMethodName(), request.path)
.scheme(request.scheme)
.protocol(request.protocol)
.queryParams(request.queryParameters)
.headers(request.headers)
.cookies(request.cookies)
.body(request.body);
}
/**
* Builder over HTTP methods.
*/
public static class MethodBuilder {
/**
* Factory method for a generic HTTP method.
* @param method to call
* @param path to call
* @return builder
*/
public Request.Builder method(String method, String path) {
return new Request.Builder(HttpMethods.HttpMethod.valueOf(method.toUpperCase()), path);
}
/**
* Factory method for DELETE HTTP method.
* @param path to call
@@ -226,9 +251,9 @@ public class Request {
*/
public static class Builder {
final HttpMethods.HttpMethod method;
HttpMethods.HttpMethod method;
final String path;
String path;
List<AbstractMap.SimpleEntry<String, String>> queryParameters = new LinkedList<>();
@@ -247,6 +272,24 @@ public class Request {
this.path = path;
}
/**
* @param method HTTP method
* @return builder
*/
public Request.Builder method(HttpMethods.HttpMethod method) {
this.method = method;
return this;
}
/**
* @param path HTTP path
* @return builder
*/
public Request.Builder path(String path) {
this.path = path;
return this;
}
/**
* @param scheme text representation of a scheme
* @return builder
@@ -265,6 +308,24 @@ public class Request {
return this;
}
/**
* @param scheme representation of a scheme
* @return builder
*/
public Request.Builder scheme(ContractVerifierHttpMetadata.Scheme scheme) {
this.scheme = scheme;
return this;
}
/**
* @param protocol representation of a protocol
* @return builder
*/
public Request.Builder protocol(ContractVerifierHttpMetadata.Protocol protocol) {
this.protocol = protocol;
return this;
}
/**
* @param body HTTP body
* @return builder
@@ -284,6 +345,15 @@ public class Request {
return this;
}
/**
* @param queryParameters - list of query parameters
* @return builder
*/
public Request.Builder queryParams(List<AbstractMap.SimpleEntry<String, String>> queryParameters) {
this.queryParameters = queryParameters;
return this;
}
/**
* @param headers HTTP headers
* @return builder
@@ -294,8 +364,8 @@ public class Request {
}
/**
* @param key HTTP key
* @param value HTTP value
* @param key HTTP header key
* @param value HTTP header value
* @return builder
*/
public Request.Builder header(String key, Object value) {
@@ -303,6 +373,16 @@ public class Request {
return this;
}
/**
* @param key cookie key
* @param value cookie value
* @return builder
*/
public Request.Builder cookie(String key, Object value) {
this.cookies.put(key, value);
return this;
}
/**
* @param cookies HTTP cookies
* @return builder

View File

@@ -0,0 +1,52 @@
/*
* Copyright 2020-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://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.cloud.contract.verifier.http;
import java.util.AbstractMap;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.BDDAssertions.then;
class RequestTests {
@Test
void should_override_entries_when_using_builder_from_request() {
Request request = Request.given()
.delete("/foo")
.header("header", "header-value")
.cookie("cookie", "cookie-value")
.queryParam("query", "param-value")
.protocol(ContractVerifierHttpMetadata.Protocol.HTTP_1_1)
.scheme(ContractVerifierHttpMetadata.Scheme.HTTPS)
.build();
Request changedRequest = Request.from(request)
.path("/bar")
.header("header-foo", "header-bar")
.cookie("cookie-foo", "cookie-bar")
.queryParam("query-foo", "query-bar")
.build();
then(changedRequest.path()).isEqualTo("/bar");
then(changedRequest.method().name()).isEqualTo("DELETE");
then(changedRequest.headers()).containsEntry("header-foo", "header-bar").containsEntry("header", "header-value");
then(changedRequest.cookies()).containsEntry("cookie-foo", "cookie-bar").containsEntry("cookie", "cookie-value");
then(changedRequest.queryParams()).contains(new AbstractMap.SimpleEntry<>("query", "param-value"), new AbstractMap.SimpleEntry<>("query-foo", "query-bar"));
then(changedRequest.protocol()).isEqualTo(ContractVerifierHttpMetadata.Protocol.HTTP_1_1);
}
}