diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/http/Request.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/http/Request.java index 9138549d8e..4de6b80012 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/http/Request.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/http/Request.java @@ -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> 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> 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 diff --git a/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/http/RequestTests.java b/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/http/RequestTests.java new file mode 100644 index 0000000000..de012a6212 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/java/org/springframework/cloud/contract/verifier/http/RequestTests.java @@ -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); + } +}