Editing and listing fix

Edited the new content that came in with the fix for issue 1511.
    Also fixed a code listing for JAX-RS. (The tags were misplaced,
    and the additional characters broke the listing. I also had to
    replace the tab characters with tabs.)
This commit is contained in:
Marcin Grzejszczak
2020-09-18 12:29:48 +02:00
parent b839ebfa46
commit 6e951e60fd
38 changed files with 688 additions and 806 deletions

View File

@@ -10,7 +10,7 @@ to define `protected WebTarget webTarget` and server initialization. The only op
testing JAX-RS API is to start a web server. Also, a request with a body needs to have a
content type be set. Otherwise, the default of `application/octet-stream` gets used.
In order to use JAX-RS mode, use the following settings:
To use JAX-RS mode, use the following setting:
====
[source,groovy,indent=0]
@@ -130,10 +130,12 @@ include::{samples_url}/producer_webflux/src/test/java/com/example/BeerRestBase.j
[[features-custom-mode]]
=== Custom Mode
IMPORTANT: This mode is experimental and can change in the future!
IMPORTANT: This mode is experimental and can change in the future.
The Spring Cloud Contract allows you to provide your own, custom implementation of the
`org.springframework.cloud.contract.verifier.http.HttpVerifier`. That way you can use any client you want to send and receive a request. The default implementation in Spring Cloud Contract is `OkHttpHttpVerifier` and it leverages OkHttp3 http client.
The Spring Cloud Contract lets you provide your own, custom, implementation of the
`org.springframework.cloud.contract.verifier.http.HttpVerifier`. That way, you can use any client you want to send and receive a request. The default implementation in Spring Cloud Contract is `OkHttpHttpVerifier` and it uses OkHttp3 http client.
To get started, set `testMode` to `CUSTOM`:
====
[source,groovy,indent=0]
@@ -196,7 +198,7 @@ public class RestTest extends BeerRestBase {
----
====
Corresponding base class could look like this:
The following example shows a corresponding base class:
====
[source,java,indent=0]
@@ -1003,4 +1005,4 @@ public class GrpcTests {
}
----
====
====

View File

@@ -30,8 +30,8 @@ class CustomModeBodyGiven implements Given {
private final BodyParser bodyParser;
CustomModeBodyGiven(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
CustomModeBodyGiven(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData,
BodyParser bodyParser) {
this.blockBuilder = blockBuilder;
this.bodyReader = new BodyReader(generatedClassMetaData);
this.bodyParser = bodyParser;
@@ -47,8 +47,7 @@ class CustomModeBodyGiven implements Given {
Object body;
Request request = metadata.getContract().getRequest();
Object serverValue = request.getBody().getServerValue();
if (serverValue instanceof ExecutionProperty
|| serverValue instanceof FromFileProperty) {
if (serverValue instanceof ExecutionProperty || serverValue instanceof FromFileProperty) {
body = request.getBody().getServerValue();
}
else {
@@ -65,10 +64,8 @@ class CustomModeBodyGiven implements Given {
else if (body instanceof FromFileProperty) {
FromFileProperty fileProperty = (FromFileProperty) body;
value = fileProperty.isByte()
? this.bodyReader.readBytesFromFileString(metadata, fileProperty,
CommunicationType.REQUEST)
: this.bodyReader.readStringFromFileString(metadata, fileProperty,
CommunicationType.REQUEST);
? this.bodyReader.readBytesFromFileString(metadata, fileProperty, CommunicationType.REQUEST)
: this.bodyReader.readStringFromFileString(metadata, fileProperty, CommunicationType.REQUEST);
}
else {
String escaped = escapeRequestSpecialChars(metadata, body.toString());
@@ -77,8 +74,7 @@ class CustomModeBodyGiven implements Given {
return ".body(" + value + ")";
}
private String escapeRequestSpecialChars(SingleContractMetadata metadata,
String string) {
private String escapeRequestSpecialChars(SingleContractMetadata metadata, String string) {
if (metadata.getInputTestContentType() == ContentType.JSON) {
return string.replaceAll("\\\\n", "\\\\\\\\n");
}

View File

@@ -54,15 +54,13 @@ class CustomModeCookiesGiven implements Given {
}
private String string(Cookie cookie) {
return ".cookie(" + ContentHelper.getTestSideForNonBodyValue(cookie.getKey())
+ ", " + ContentHelper.getTestSideForNonBodyValue(cookie.getServerValue())
+ ")";
return ".cookie(" + ContentHelper.getTestSideForNonBodyValue(cookie.getKey()) + ", "
+ ContentHelper.getTestSideForNonBodyValue(cookie.getServerValue()) + ")";
}
private boolean ofAbsentType(Cookie cookie) {
return cookie.getServerValue() instanceof MatchingStrategy
&& MatchingStrategy.Type.ABSENT
.equals(((MatchingStrategy) cookie.getServerValue()).getType());
&& MatchingStrategy.Type.ABSENT.equals(((MatchingStrategy) cookie.getServerValue()).getType());
}
@Override

View File

@@ -25,8 +25,7 @@ class CustomModeCookiesThen implements Then, CustomModeAcceptor, CookieElementPr
private final ComparisonBuilder comparisonBuilder;
CustomModeCookiesThen(BlockBuilder blockBuilder,
ComparisonBuilder comparisonBuilder) {
CustomModeCookiesThen(BlockBuilder blockBuilder, ComparisonBuilder comparisonBuilder) {
this.blockBuilder = blockBuilder;
this.comparisonBuilder = comparisonBuilder;
}

View File

@@ -26,8 +26,7 @@ class CustomModeFields implements Field, CustomModeAcceptor {
private static final String[] FIELDS = { "@Inject HttpVerifier httpVerifier" };
CustomModeFields(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData) {
CustomModeFields(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
}

View File

@@ -33,22 +33,17 @@ class CustomModeGiven implements Given, BodyMethodVisitor, CustomModeAcceptor {
private final List<Given> bodyGivens = new LinkedList<>();
CustomModeGiven(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
CustomModeGiven(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
this.requestGivens.addAll(Collections.singletonList(
new CustomModeRequestGiven(blockBuilder, generatedClassMetaData)));
this.bodyGivens.addAll(
Arrays.asList(new CustomModeMethodWithUrlGiven(blockBuilder, bodyParser),
new CustomModeQueryParamsGiven(blockBuilder, bodyParser),
new CustomModeSchemeProtocolGiven(blockBuilder),
new CustomModeHeadersGiven(blockBuilder),
new CustomModeCookiesGiven(blockBuilder),
new CustomModeBodyGiven(blockBuilder, generatedClassMetaData,
bodyParser),
new CustomMultipartGiven(generatedClassMetaData),
new CustomModeRequestBuildGiven(blockBuilder)));
this.requestGivens
.addAll(Collections.singletonList(new CustomModeRequestGiven(blockBuilder, generatedClassMetaData)));
this.bodyGivens.addAll(Arrays.asList(new CustomModeMethodWithUrlGiven(blockBuilder, bodyParser),
new CustomModeQueryParamsGiven(blockBuilder, bodyParser),
new CustomModeSchemeProtocolGiven(blockBuilder), new CustomModeHeadersGiven(blockBuilder),
new CustomModeCookiesGiven(blockBuilder),
new CustomModeBodyGiven(blockBuilder, generatedClassMetaData, bodyParser),
new CustomMultipartGiven(generatedClassMetaData), new CustomModeRequestBuildGiven(blockBuilder)));
}
@Override
@@ -61,8 +56,7 @@ class CustomModeGiven implements Given, BodyMethodVisitor, CustomModeAcceptor {
}
private void addRequestGivenLine(SingleContractMetadata singleContractMetadata) {
this.requestGivens.stream().filter(given -> given.accept(singleContractMetadata))
.findFirst()
this.requestGivens.stream().filter(given -> given.accept(singleContractMetadata)).findFirst()
.orElseThrow(() -> new IllegalStateException(
"No matching request building Given implementation for a custom test mode"))
.apply(singleContractMetadata);

View File

@@ -56,17 +56,15 @@ class CustomModeHeadersGiven implements Given {
}
private String string(Header header) {
return ".header(" + ContentHelper.getTestSideForNonBodyValue(header.getName())
+ ", "
+ ContentHelper.getTestSideForNonBodyValue(
MapConverter.getTestSideValuesForNonBody(header.getServerValue()))
return ".header("
+ ContentHelper.getTestSideForNonBodyValue(header.getName()) + ", " + ContentHelper
.getTestSideForNonBodyValue(MapConverter.getTestSideValuesForNonBody(header.getServerValue()))
+ ")";
}
private boolean ofAbsentType(Header header) {
return header.getServerValue() instanceof MatchingStrategy
&& MatchingStrategy.Type.ABSENT
.equals(((MatchingStrategy) header.getServerValue()).getType());
&& MatchingStrategy.Type.ABSENT.equals(((MatchingStrategy) header.getServerValue()).getType());
}
@Override

View File

@@ -32,8 +32,7 @@ class CustomModeHeadersThen implements Then, CustomModeAcceptor {
private final ComparisonBuilder comparisonBuilder;
CustomModeHeadersThen(BlockBuilder blockBuilder,
ComparisonBuilder comparisonBuilder) {
CustomModeHeadersThen(BlockBuilder blockBuilder, ComparisonBuilder comparisonBuilder) {
this.blockBuilder = blockBuilder;
this.comparisonBuilder = comparisonBuilder;
}
@@ -45,10 +44,8 @@ class CustomModeHeadersThen implements Then, CustomModeAcceptor {
Iterator<Header> iterator = headers.getEntries().iterator();
while (iterator.hasNext()) {
Header header = iterator.next();
String text = processHeaderElement(header.getName(),
header.getServerValue() instanceof NotToEscapePattern
? header.getServerValue()
: MapConverter.getTestSideValues(header.getServerValue()));
String text = processHeaderElement(header.getName(), header.getServerValue() instanceof NotToEscapePattern
? header.getServerValue() : MapConverter.getTestSideValues(header.getServerValue()));
if (iterator.hasNext()) {
this.blockBuilder.addLineWithEnding(text);
}
@@ -62,22 +59,18 @@ class CustomModeHeadersThen implements Then, CustomModeAcceptor {
private String processHeaderElement(String property, Object value) {
if (value instanceof NotToEscapePattern) {
return this.comparisonBuilder
.assertThat("response.header(\"" + property + "\")")
return this.comparisonBuilder.assertThat("response.header(\"" + property + "\")")
+ matchesManuallyEscapedPattern((NotToEscapePattern) value);
}
else if (value instanceof ExecutionProperty) {
return ((ExecutionProperty) value)
.insertValue("response.header(\"" + property + "\")");
return ((ExecutionProperty) value).insertValue("response.header(\"" + property + "\")");
}
return this.comparisonBuilder.assertThat("response.header(\"" + property + "\")",
value);
return this.comparisonBuilder.assertThat("response.header(\"" + property + "\")", value);
}
private String matchesManuallyEscapedPattern(NotToEscapePattern value) {
return this.comparisonBuilder
.matchesEscaped(value.getServerValue().pattern().replace("\\", "\\\\"));
return this.comparisonBuilder.matchesEscaped(value.getServerValue().pattern().replace("\\", "\\\\"));
}
@Override

View File

@@ -29,16 +29,14 @@ class CustomModeImports implements Imports, CustomModeAcceptor {
"org.springframework.cloud.contract.verifier.http.Request",
"org.springframework.cloud.contract.verifier.http.Response;" };
CustomModeImports(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData) {
CustomModeImports(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
}
@Override
public Imports call() {
Arrays.stream(IMPORTS)
.forEach(s -> this.blockBuilder.addLineWithEnding("import " + s));
Arrays.stream(IMPORTS).forEach(s -> this.blockBuilder.addLineWithEnding("import " + s));
return this;
}

View File

@@ -35,8 +35,7 @@ class CustomModeMethodWithUrlGiven implements Given {
@Override
public MethodVisitor<Given> apply(SingleContractMetadata metadata) {
addUrl(getUrl(metadata.getContract().getRequest()),
metadata.getContract().getRequest());
addUrl(getUrl(metadata.getContract().getRequest()), metadata.getContract().getRequest());
return this;
}

View File

@@ -27,8 +27,7 @@ import org.springframework.cloud.contract.spec.internal.Url;
import org.springframework.cloud.contract.verifier.file.SingleContractMetadata;
import org.springframework.cloud.contract.verifier.util.MapConverter;
class CustomModeQueryParamsGiven
implements Given, CustomModeAcceptor, QueryParamsResolver {
class CustomModeQueryParamsGiven implements Given, CustomModeAcceptor, QueryParamsResolver {
private final BlockBuilder blockBuilder;
@@ -58,9 +57,8 @@ class CustomModeQueryParamsGiven
}
private void addQueryParameters(Url buildUrl) {
List<QueryParameter> queryParameters = buildUrl.getQueryParameters()
.getParameters().stream().filter(this::allowedQueryParameter)
.collect(Collectors.toList());
List<QueryParameter> queryParameters = buildUrl.getQueryParameters().getParameters().stream()
.filter(this::allowedQueryParameter).collect(Collectors.toList());
Iterator<QueryParameter> iterator = queryParameters.iterator();
while (iterator.hasNext()) {
QueryParameter parameter = iterator.next();
@@ -85,17 +83,14 @@ class CustomModeQueryParamsGiven
}
private String addQueryParameter(QueryParameter queryParam) {
return "." + "queryParam(" + this.bodyParser.quotedLongText(queryParam.getName())
+ "," + this.bodyParser.quotedLongText(resolveParamValue(
MapConverter.getTestSideValuesForNonBody(queryParam)))
+ ")";
return "." + "queryParam(" + this.bodyParser.quotedLongText(queryParam.getName()) + "," + this.bodyParser
.quotedLongText(resolveParamValue(MapConverter.getTestSideValuesForNonBody(queryParam))) + ")";
}
@Override
public boolean accept(SingleContractMetadata metadata) {
return acceptType(metadata) && metadata.getContract().getRequest() != null
&& getUrl(metadata.getContract().getRequest())
.getQueryParameters() != null;
&& getUrl(metadata.getContract().getRequest()).getQueryParameters() != null;
}
}

View File

@@ -31,9 +31,7 @@ class CustomModeResponseWhen implements When, CustomModeAcceptor {
@Override
public MethodVisitor<When> apply(SingleContractMetadata metadata) {
this.blockBuilder
.addLineWithEnding("Response response = httpVerifier.exchange(request)")
.endBlock();
this.blockBuilder.addLineWithEnding("Response response = httpVerifier.exchange(request)").endBlock();
return this;
}

View File

@@ -32,13 +32,9 @@ class CustomModeSchemeProtocolGiven implements Given {
@Override
public MethodVisitor<Given> apply(SingleContractMetadata metadata) {
Contract contract = metadata.getContract();
ContractVerifierHttpMetaData httpMetadata = ContractVerifierHttpMetaData
.fromMetadata(contract.getMetadata());
this.blockBuilder
.addIndented(".scheme(\"" + httpMetadata.getScheme().name() + "\")")
.addEmptyLine();
this.blockBuilder.addIndented(
".protocol(\"" + httpMetadata.getProtocol().toString() + "\")");
ContractVerifierHttpMetaData httpMetadata = ContractVerifierHttpMetaData.fromMetadata(contract.getMetadata());
this.blockBuilder.addIndented(".scheme(\"" + httpMetadata.getScheme().name() + "\")").addEmptyLine();
this.blockBuilder.addIndented(".protocol(\"" + httpMetadata.getProtocol().toString() + "\")");
return this;
}

View File

@@ -24,19 +24,16 @@ class CustomModeStaticImports implements Imports, CustomModeAcceptor {
private final GeneratedClassMetaData generatedClassMetaData;
private static final String[] IMPORTS = {
"org.springframework.cloud.contract.verifier.http.Request.given" };
private static final String[] IMPORTS = { "org.springframework.cloud.contract.verifier.http.Request.given" };
CustomModeStaticImports(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData) {
CustomModeStaticImports(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
}
@Override
public Imports call() {
Arrays.stream(IMPORTS)
.forEach(s -> this.blockBuilder.addLineWithEnding("import static " + s));
Arrays.stream(IMPORTS).forEach(s -> this.blockBuilder.addLineWithEnding("import static " + s));
return this;
}

View File

@@ -25,8 +25,7 @@ class CustomModeStatusCodeThen implements Then {
private final ComparisonBuilder comparisonBuilder;
CustomModeStatusCodeThen(BlockBuilder blockBuilder,
ComparisonBuilder comparisonBuilder) {
CustomModeStatusCodeThen(BlockBuilder blockBuilder, ComparisonBuilder comparisonBuilder) {
this.blockBuilder = blockBuilder;
this.comparisonBuilder = comparisonBuilder;
}
@@ -34,9 +33,8 @@ class CustomModeStatusCodeThen implements Then {
@Override
public MethodVisitor<Then> apply(SingleContractMetadata metadata) {
Response response = metadata.getContract().getResponse();
this.blockBuilder
.addIndented(this.comparisonBuilder.assertThat("response.statusCode()",
response.getStatus().getServerValue()))
this.blockBuilder.addIndented(
this.comparisonBuilder.assertThat("response.statusCode()", response.getStatus().getServerValue()))
.addEndingIfNotPresent();
return this;
}

View File

@@ -30,17 +30,14 @@ class CustomModeThen implements Then, BodyMethodVisitor, CustomModeAcceptor {
private final List<Then> thens = new LinkedList<>();
CustomModeThen(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser,
CustomModeThen(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser,
ComparisonBuilder comparisonBuilder) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
this.thens.addAll(Arrays.asList(
new CustomModeStatusCodeThen(this.blockBuilder, comparisonBuilder),
this.thens.addAll(Arrays.asList(new CustomModeStatusCodeThen(this.blockBuilder, comparisonBuilder),
new CustomModeHeadersThen(this.blockBuilder, comparisonBuilder),
new CustomModeCookiesThen(this.blockBuilder, comparisonBuilder),
new GenericHttpBodyThen(this.blockBuilder, generatedClassMetaData,
bodyParser, comparisonBuilder)));
new GenericHttpBodyThen(this.blockBuilder, generatedClassMetaData, bodyParser, comparisonBuilder)));
}
@Override

View File

@@ -30,12 +30,10 @@ class CustomModeWhen implements When, BodyMethodVisitor, CustomModeAcceptor {
private final List<When> responseWhens = new LinkedList<>();
CustomModeWhen(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData) {
CustomModeWhen(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
this.responseWhens.addAll(Arrays.asList(
new CustomModeResponseWhen(blockBuilder, this.generatedClassMetaData)));
this.responseWhens.addAll(Arrays.asList(new CustomModeResponseWhen(blockBuilder, this.generatedClassMetaData)));
}
@Override
@@ -47,10 +45,8 @@ class CustomModeWhen implements When, BodyMethodVisitor, CustomModeAcceptor {
}
private void addResponseWhenLine(SingleContractMetadata singleContractMetadata) {
this.responseWhens.stream().filter(when -> when.accept(singleContractMetadata))
.findFirst()
.orElseThrow(() -> new IllegalStateException(
"No matching request building When implementation for Rest Assured"))
this.responseWhens.stream().filter(when -> when.accept(singleContractMetadata)).findFirst().orElseThrow(
() -> new IllegalStateException("No matching request building When implementation for Rest Assured"))
.apply(singleContractMetadata);
}

View File

@@ -35,8 +35,7 @@ class CustomMultipartGiven implements Given, CustomModeAcceptor {
@Override
public boolean accept(SingleContractMetadata metadata) {
Request request = metadata.getContract().getRequest();
return request != null && request.getMultipart() != null
&& acceptType(this.generatedClassMetaData, metadata);
return request != null && request.getMultipart() != null && acceptType(this.generatedClassMetaData, metadata);
}
}

View File

@@ -36,8 +36,8 @@ class JavaMultipartGiven implements Given, RestAssuredAcceptor {
private final BodyParser bodyParser;
JavaMultipartGiven(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
JavaMultipartGiven(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData,
BodyParser bodyParser) {
this.blockBuilder = blockBuilder;
this.bodyReader = new BodyReader(generatedClassMetaData);
this.bodyParser = bodyParser;
@@ -46,47 +46,40 @@ class JavaMultipartGiven implements Given, RestAssuredAcceptor {
@Override
public MethodVisitor<Given> apply(SingleContractMetadata metadata) {
getMultipartParameters(metadata).entrySet().forEach(entry -> this.blockBuilder
.addLine(getMultipartParameterLine(metadata, entry)));
getMultipartParameters(metadata).entrySet()
.forEach(entry -> this.blockBuilder.addLine(getMultipartParameterLine(metadata, entry)));
return this;
}
private String getMultipartParameterLine(SingleContractMetadata metadata,
Map.Entry<String, Object> parameter) {
private String getMultipartParameterLine(SingleContractMetadata metadata, Map.Entry<String, Object> parameter) {
if (parameter.getValue() instanceof NamedProperty) {
return ".multiPart(" + getMultipartFileParameterContent(metadata,
parameter.getKey(), (NamedProperty) parameter.getValue()) + ")";
return ".multiPart(" + getMultipartFileParameterContent(metadata, parameter.getKey(),
(NamedProperty) parameter.getValue()) + ")";
}
return getParameterString(parameter);
}
@SuppressWarnings("unchecked")
private Map<String, Object> getMultipartParameters(SingleContractMetadata metadata) {
return (Map<String, Object>) metadata.getContract().getRequest().getMultipart()
.getServerValue();
return (Map<String, Object>) metadata.getContract().getRequest().getMultipart().getServerValue();
}
private String getMultipartFileParameterContent(SingleContractMetadata metadata,
String propertyName, NamedProperty propertyValue) {
private String getMultipartFileParameterContent(SingleContractMetadata metadata, String propertyName,
NamedProperty propertyValue) {
return getJavaMultipartFileParameterContent(propertyName, propertyValue,
fileProp -> this.bodyReader.readBytesFromFileString(metadata, fileProp,
CommunicationType.REQUEST));
fileProp -> this.bodyReader.readBytesFromFileString(metadata, fileProp, CommunicationType.REQUEST));
}
private String getParameterString(Map.Entry<String, Object> parameter) {
return ".param(" + this.bodyParser.quotedShortText(parameter.getKey()) + ", "
+ this.bodyParser.quotedShortText(
MapConverter.getTestSideValuesForNonBody(parameter.getValue()))
+ ")";
+ this.bodyParser.quotedShortText(MapConverter.getTestSideValuesForNonBody(parameter.getValue())) + ")";
}
@Override
public boolean accept(SingleContractMetadata metadata) {
Request request = metadata.getContract().getRequest();
return request != null && request.getMultipart() != null
&& acceptType(this.generatedClassMetaData, metadata)
&& this.generatedClassMetaData.configProperties
.getTestFramework() != TestFramework.SPOCK;
return request != null && request.getMultipart() != null && acceptType(this.generatedClassMetaData, metadata)
&& this.generatedClassMetaData.configProperties.getTestFramework() != TestFramework.SPOCK;
}
}

View File

@@ -24,8 +24,7 @@ interface RestAssuredAcceptor {
default boolean acceptType(GeneratedClassMetaData generatedClassMetaData,
SingleContractMetadata singleContractMetadata) {
return generatedClassMetaData.configProperties.getTestMode() != TestMode.CUSTOM
&& generatedClassMetaData.configProperties
.getTestMode() != TestMode.JAXRSCLIENT
&& generatedClassMetaData.configProperties.getTestMode() != TestMode.JAXRSCLIENT
&& singleContractMetadata.isHttp();
}

View File

@@ -19,8 +19,7 @@ package org.springframework.cloud.contract.verifier.builder;
import org.springframework.cloud.contract.spec.internal.Response;
import org.springframework.cloud.contract.verifier.file.SingleContractMetadata;
class RestAssuredCookiesThen
implements Then, RestAssuredAcceptor, CookieElementProcessor {
class RestAssuredCookiesThen implements Then, RestAssuredAcceptor, CookieElementProcessor {
private final BlockBuilder blockBuilder;

View File

@@ -32,21 +32,18 @@ class RestAssuredGiven implements Given, BodyMethodVisitor, RestAssuredAcceptor
private final List<Given> bodyGivens = new LinkedList<>();
RestAssuredGiven(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
RestAssuredGiven(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
this.requestGivens.addAll(Arrays.asList(
new MockMvcRequestGiven(blockBuilder, generatedClassMetaData),
this.requestGivens.addAll(Arrays.asList(new MockMvcRequestGiven(blockBuilder, generatedClassMetaData),
new SpockMockMvcRequestGiven(blockBuilder, generatedClassMetaData),
new ExplicitRequestGiven(blockBuilder, generatedClassMetaData),
new WebTestClientRequestGiven(blockBuilder, generatedClassMetaData)));
this.bodyGivens.addAll(Arrays.asList(new MockMvcHeadersGiven(blockBuilder),
new MockMvcCookiesGiven(blockBuilder),
new MockMvcBodyGiven(blockBuilder, generatedClassMetaData, bodyParser),
new JavaMultipartGiven(blockBuilder, generatedClassMetaData, bodyParser),
new SpockMockMvcMultipartGiven(blockBuilder, generatedClassMetaData,
bodyParser)));
this.bodyGivens
.addAll(Arrays.asList(new MockMvcHeadersGiven(blockBuilder), new MockMvcCookiesGiven(blockBuilder),
new MockMvcBodyGiven(blockBuilder, generatedClassMetaData, bodyParser),
new JavaMultipartGiven(blockBuilder, generatedClassMetaData, bodyParser),
new SpockMockMvcMultipartGiven(blockBuilder, generatedClassMetaData, bodyParser)));
}
@Override
@@ -59,10 +56,8 @@ class RestAssuredGiven implements Given, BodyMethodVisitor, RestAssuredAcceptor
}
private void addRequestGivenLine(SingleContractMetadata singleContractMetadata) {
this.requestGivens.stream().filter(given -> given.accept(singleContractMetadata))
.findFirst()
.orElseThrow(() -> new IllegalStateException(
"No matching request building Given implementation for Rest Assured"))
this.requestGivens.stream().filter(given -> given.accept(singleContractMetadata)).findFirst().orElseThrow(
() -> new IllegalStateException("No matching request building Given implementation for Rest Assured"))
.apply(singleContractMetadata);
}

View File

@@ -30,17 +30,14 @@ class RestAssuredThen implements Then, BodyMethodVisitor, RestAssuredAcceptor {
private final List<Then> thens = new LinkedList<>();
RestAssuredThen(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser,
RestAssuredThen(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser,
ComparisonBuilder comparisonBuilder) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
this.thens.addAll(Arrays.asList(
new RestAssuredStatusCodeThen(this.blockBuilder, comparisonBuilder),
this.thens.addAll(Arrays.asList(new RestAssuredStatusCodeThen(this.blockBuilder, comparisonBuilder),
new RestAssuredHeadersThen(this.blockBuilder, comparisonBuilder),
new RestAssuredCookiesThen(this.blockBuilder, comparisonBuilder),
new GenericHttpBodyThen(this.blockBuilder, generatedClassMetaData,
bodyParser, comparisonBuilder)));
new GenericHttpBodyThen(this.blockBuilder, generatedClassMetaData, bodyParser, comparisonBuilder)));
}
@Override

View File

@@ -32,21 +32,16 @@ class RestAssuredWhen implements When, BodyMethodVisitor, RestAssuredAcceptor {
private final List<When> whens = new LinkedList<>();
RestAssuredWhen(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
RestAssuredWhen(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
this.responseWhens.addAll(Arrays.asList(
new MockMvcResponseWhen(blockBuilder, this.generatedClassMetaData),
this.responseWhens.addAll(Arrays.asList(new MockMvcResponseWhen(blockBuilder, this.generatedClassMetaData),
new SpockMockMvcResponseWhen(blockBuilder, this.generatedClassMetaData),
new ExplicitResponseWhen(blockBuilder, this.generatedClassMetaData),
new WebTestClientResponseWhen(blockBuilder,
this.generatedClassMetaData)));
this.whens.addAll(
Arrays.asList(new MockMvcQueryParamsWhen(this.blockBuilder, bodyParser),
new MockMvcAsyncWhen(this.blockBuilder,
this.generatedClassMetaData),
new MockMvcUrlWhen(this.blockBuilder, bodyParser)));
new WebTestClientResponseWhen(blockBuilder, this.generatedClassMetaData)));
this.whens.addAll(Arrays.asList(new MockMvcQueryParamsWhen(this.blockBuilder, bodyParser),
new MockMvcAsyncWhen(this.blockBuilder, this.generatedClassMetaData),
new MockMvcUrlWhen(this.blockBuilder, bodyParser)));
}
@Override
@@ -59,10 +54,8 @@ class RestAssuredWhen implements When, BodyMethodVisitor, RestAssuredAcceptor {
}
private void addResponseWhenLine(SingleContractMetadata singleContractMetadata) {
this.responseWhens.stream().filter(when -> when.accept(singleContractMetadata))
.findFirst()
.orElseThrow(() -> new IllegalStateException(
"No matching request building When implementation for Rest Assured"))
this.responseWhens.stream().filter(when -> when.accept(singleContractMetadata)).findFirst().orElseThrow(
() -> new IllegalStateException("No matching request building When implementation for Rest Assured"))
.apply(singleContractMetadata);
}

View File

@@ -100,17 +100,12 @@ class SingleMethodBuilder {
}
SingleMethodBuilder customMode() {
return given(new CustomModeGiven(this.blockBuilder, this.generatedClassMetaData,
CustomModeBodyParser.INSTANCE))
.methodPreProcessor(new InProgressContractMethodPreProcessor())
.when(new CustomModeWhen(this.blockBuilder,
this.generatedClassMetaData))
.then(new CustomModeThen(this.blockBuilder,
this.generatedClassMetaData,
CustomModeBodyParser.INSTANCE,
ComparisonBuilder.JAVA_HTTP_INSTANCE))
.methodPostProcessor(new TemplateUpdatingMethodPostProcessor(
this.blockBuilder));
return given(new CustomModeGiven(this.blockBuilder, this.generatedClassMetaData, CustomModeBodyParser.INSTANCE))
.methodPreProcessor(new InProgressContractMethodPreProcessor())
.when(new CustomModeWhen(this.blockBuilder, this.generatedClassMetaData))
.then(new CustomModeThen(this.blockBuilder, this.generatedClassMetaData, CustomModeBodyParser.INSTANCE,
ComparisonBuilder.JAVA_HTTP_INSTANCE))
.methodPostProcessor(new TemplateUpdatingMethodPostProcessor(this.blockBuilder));
}
SingleMethodBuilder jaxRs() {

View File

@@ -35,8 +35,8 @@ class SpockMockMvcMultipartGiven implements Given, MockMvcAcceptor {
private final BodyParser bodyParser;
SpockMockMvcMultipartGiven(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData, BodyParser bodyParser) {
SpockMockMvcMultipartGiven(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData,
BodyParser bodyParser) {
this.blockBuilder = blockBuilder;
this.bodyReader = new BodyReader(generatedClassMetaData);
this.bodyParser = bodyParser;
@@ -45,48 +45,40 @@ class SpockMockMvcMultipartGiven implements Given, MockMvcAcceptor {
@Override
public MethodVisitor<Given> apply(SingleContractMetadata metadata) {
getMultipartParameters(metadata).entrySet().forEach(entry -> this.blockBuilder
.addLine(getMultipartParameterLine(metadata, entry)));
getMultipartParameters(metadata).entrySet()
.forEach(entry -> this.blockBuilder.addLine(getMultipartParameterLine(metadata, entry)));
return this;
}
private String getMultipartParameterLine(SingleContractMetadata metadata,
Map.Entry<String, Object> parameter) {
private String getMultipartParameterLine(SingleContractMetadata metadata, Map.Entry<String, Object> parameter) {
if (parameter.getValue() instanceof NamedProperty) {
return ".multiPart(" + getMultipartFileParameterContent(metadata,
parameter.getKey(), (NamedProperty) parameter.getValue()) + ")";
return ".multiPart(" + getMultipartFileParameterContent(metadata, parameter.getKey(),
(NamedProperty) parameter.getValue()) + ")";
}
return getParameterString(parameter);
}
@SuppressWarnings("unchecked")
private Map<String, Object> getMultipartParameters(SingleContractMetadata metadata) {
return (Map<String, Object>) metadata.getContract().getRequest().getMultipart()
.getServerValue();
return (Map<String, Object>) metadata.getContract().getRequest().getMultipart().getServerValue();
}
private String getMultipartFileParameterContent(SingleContractMetadata metadata,
String propertyName, NamedProperty propertyValue) {
return ContentUtils.getGroovyMultipartFileParameterContent(propertyName,
propertyValue,
fileProp -> this.bodyReader.readBytesFromFileString(metadata, fileProp,
CommunicationType.REQUEST));
private String getMultipartFileParameterContent(SingleContractMetadata metadata, String propertyName,
NamedProperty propertyValue) {
return ContentUtils.getGroovyMultipartFileParameterContent(propertyName, propertyValue,
fileProp -> this.bodyReader.readBytesFromFileString(metadata, fileProp, CommunicationType.REQUEST));
}
private String getParameterString(Map.Entry<String, Object> parameter) {
return ".param(" + this.bodyParser.quotedShortText(parameter.getKey()) + ", "
+ this.bodyParser.quotedShortText(
MapConverter.getTestSideValuesForNonBody(parameter.getValue()))
+ ")";
+ this.bodyParser.quotedShortText(MapConverter.getTestSideValuesForNonBody(parameter.getValue())) + ")";
}
@Override
public boolean accept(SingleContractMetadata metadata) {
Request request = metadata.getContract().getRequest();
return request != null && request.getMultipart() != null
&& acceptType(this.generatedClassMetaData, metadata)
&& this.generatedClassMetaData.configProperties
.getTestFramework() == TestFramework.SPOCK;
return request != null && request.getMultipart() != null && acceptType(this.generatedClassMetaData, metadata)
&& this.generatedClassMetaData.configProperties.getTestFramework() == TestFramework.SPOCK;
}
}

View File

@@ -24,8 +24,7 @@ class UserImports implements Imports {
private final GeneratedClassMetaData generatedClassMetaData;
UserImports(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData) {
UserImports(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
}

View File

@@ -24,8 +24,7 @@ class UserStaticImports implements Imports {
private final GeneratedClassMetaData generatedClassMetaData;
UserStaticImports(BlockBuilder blockBuilder,
GeneratedClassMetaData generatedClassMetaData) {
UserStaticImports(BlockBuilder blockBuilder, GeneratedClassMetaData generatedClassMetaData) {
this.blockBuilder = blockBuilder;
this.generatedClassMetaData = generatedClassMetaData;
}
@@ -40,8 +39,7 @@ class UserStaticImports implements Imports {
@Override
public boolean accept() {
return this.generatedClassMetaData.configProperties.getStaticImports() != null
&& this.generatedClassMetaData.configProperties
.getStaticImports().length > 0;
&& this.generatedClassMetaData.configProperties.getStaticImports().length > 0;
}
}

View File

@@ -50,10 +50,8 @@ public class ContractVerifierHttpMetaData implements SpringCloudContractMetadata
private Protocol protocol = Protocol.HTTP_1_1;
@NonNull
public static ContractVerifierHttpMetaData fromMetadata(
Map<String, Object> metadata) {
return MetadataUtil.fromMetadata(metadata, METADATA_KEY,
new ContractVerifierHttpMetaData());
public static ContractVerifierHttpMetaData fromMetadata(Map<String, Object> metadata) {
return MetadataUtil.fromMetadata(metadata, METADATA_KEY, new ContractVerifierHttpMetaData());
}
@Override
@@ -110,8 +108,7 @@ public class ContractVerifierHttpMetaData implements SpringCloudContractMetadata
*/
@Nullable
public static Scheme fromString(String scheme) {
return Arrays.stream(values()).filter(p -> p.name().equalsIgnoreCase(scheme))
.findFirst().orElse(null);
return Arrays.stream(values()).filter(p -> p.name().equalsIgnoreCase(scheme)).findFirst().orElse(null);
}
}
@@ -184,9 +181,7 @@ public class ContractVerifierHttpMetaData implements SpringCloudContractMetadata
*/
@Nullable
public static Protocol fromString(String protocol) {
return Arrays.stream(values())
.filter(p -> p.protocol.equalsIgnoreCase(protocol)).findFirst()
.orElse(null);
return Arrays.stream(values()).filter(p -> p.protocol.equalsIgnoreCase(protocol)).findFirst().orElse(null);
}
}

View File

@@ -56,18 +56,15 @@ public class OkHttpHttpVerifier implements HttpVerifier {
@Override
public Response exchange(Request request) {
String requestContentType = request.contentType();
OkHttpClient client = new OkHttpClient.Builder()
.protocols(toProtocol(request.protocol().toString())).build();
OkHttpClient client = new OkHttpClient.Builder().protocols(toProtocol(request.protocol().toString())).build();
Map<String, String> headers = stringTyped(request.headers());
if (!request.cookies().isEmpty()) {
headers.put("Set-Cookie",
request.cookies().entrySet().stream()
.map(e -> e.getKey() + "=" + e.getValue().toString())
.collect(Collectors.joining(";")));
headers.put("Set-Cookie", request.cookies().entrySet().stream()
.map(e -> e.getKey() + "=" + e.getValue().toString()).collect(Collectors.joining(";")));
}
okhttp3.Request req = new okhttp3.Request.Builder().url(url(request))
.method(request.method().name(), requestBody(request, requestContentType))
.headers(Headers.of(headers)).build();
.method(request.method().name(), requestBody(request, requestContentType)).headers(Headers.of(headers))
.build();
try (okhttp3.Response res = client.newCall(req).execute()) {
return response(res);
}
@@ -78,13 +75,10 @@ public class OkHttpHttpVerifier implements HttpVerifier {
private String url(Request request) {
String url = request.scheme().name().toLowerCase() + ":" + this.hostAndPort
+ (request.path().startsWith("/") ? request.path()
: "/" + request.path());
+ (request.path().startsWith("/") ? request.path() : "/" + request.path());
if (!request.queryParams().isEmpty()) {
return url + "?"
+ request.queryParams().stream()
.map(e -> e.getKey() + "=" + e.getValue())
.collect(Collectors.joining("&"));
return url + "?" + request.queryParams().stream().map(e -> e.getKey() + "=" + e.getValue())
.collect(Collectors.joining("&"));
}
return url;
}
@@ -111,16 +105,13 @@ public class OkHttpHttpVerifier implements HttpVerifier {
private Response response(okhttp3.Response res) throws IOException {
byte[] responseBody = responseBody(res);
return Response.builder().body(responseBody).statusCode(res.code())
.headers(withSingleHeader(res)).cookies(res.headers().values("Set-Cookie")
.stream().flatMap(s -> Arrays.stream(s.split(";"))).map(s -> {
String[] singleCookie = s.split("=");
return new AbstractMap.SimpleEntry<>(singleCookie[0],
singleCookie.length > 1 ? singleCookie[1] : "");
})
.collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue, (a, b) -> a,
HashMap::new)))
return Response.builder().body(responseBody).statusCode(res.code()).headers(withSingleHeader(res)).cookies(
res.headers().values("Set-Cookie").stream().flatMap(s -> Arrays.stream(s.split(";"))).map(s -> {
String[] singleCookie = s.split("=");
return new AbstractMap.SimpleEntry<>(singleCookie[0],
singleCookie.length > 1 ? singleCookie[1] : "");
}).collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue,
(a, b) -> a, HashMap::new)))
.build();
}
@@ -138,13 +129,12 @@ public class OkHttpHttpVerifier implements HttpVerifier {
}
private Map<String, Object> withSingleHeader(okhttp3.Response res) {
return res.headers().toMultimap().entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey, e -> e.getValue().get(0), (a, b) -> a, HashMap::new));
return res.headers().toMultimap().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get(0), (a, b) -> a, HashMap::new));
}
private Map<String, String> stringTyped(Map<String, Object> headers) {
return headers.entrySet().stream().collect(
Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString()));
return headers.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString()));
}
}

View File

@@ -50,16 +50,14 @@ public class Request {
private final Map<String, Object> cookies;
Request(ContractVerifierHttpMetaData.Protocol protocol,
ContractVerifierHttpMetaData.Scheme scheme, HttpMethods.HttpMethod method,
String path, List<AbstractMap.SimpleEntry<String, String>> queryParameters,
Request(ContractVerifierHttpMetaData.Protocol protocol, ContractVerifierHttpMetaData.Scheme scheme,
HttpMethods.HttpMethod method, String path, List<AbstractMap.SimpleEntry<String, String>> queryParameters,
Body body, Map<String, Object> headers, Map<String, Object> cookies) {
this.protocol = protocol;
this.scheme = scheme;
this.method = method;
this.path = path;
this.queryParameters = queryParameters == null ? new LinkedList<>()
: queryParameters;
this.queryParameters = queryParameters == null ? new LinkedList<>() : queryParameters;
this.body = body;
this.headers = headers == null ? new HashMap<>() : headers;
this.cookies = cookies == null ? new HashMap<>() : cookies;
@@ -69,9 +67,8 @@ public class Request {
* @return content type from headers
*/
public String contentType() {
Object value = this.headers.entrySet().stream()
.filter(e -> e.getKey().toLowerCase().equals("content-type")).findFirst()
.orElse(new AbstractMap.SimpleEntry<>("", null)).getValue();
Object value = this.headers.entrySet().stream().filter(e -> e.getKey().toLowerCase().equals("content-type"))
.findFirst().orElse(new AbstractMap.SimpleEntry<>("", null)).getValue();
if (value == null) {
return null;
}
@@ -147,14 +144,9 @@ public class Request {
* @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);
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);
}
/**
@@ -396,8 +388,8 @@ public class Request {
* @return built {@link Request}
*/
public Request build() {
return new Request(this.protocol, this.scheme, this.method, this.path,
this.queryParameters, this.body, this.headers, this.cookies);
return new Request(this.protocol, this.scheme, this.method, this.path, this.queryParameters, this.body,
this.headers, this.cookies);
}
}

View File

@@ -37,8 +37,7 @@ public class Response {
private final Map<String, Object> cookies;
Response(int statusCode, Body body, Map<String, Object> headers,
Map<String, Object> cookies) {
Response(int statusCode, Body body, Map<String, Object> headers, Map<String, Object> cookies) {
this.statusCode = statusCode;
this.body = body;
this.headers = headers;
@@ -57,8 +56,7 @@ public class Response {
* @return header value or null if not present
*/
public String header(String key) {
return this.headers.entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(key)).findFirst()
return this.headers.entrySet().stream().filter(e -> e.getKey().equalsIgnoreCase(key)).findFirst()
.map(e -> e.getValue().toString()).orElse(null);
}
@@ -67,8 +65,7 @@ public class Response {
* @return header value or null if not present
*/
public String cookie(String key) {
return this.cookies.entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(key)).findFirst()
return this.cookies.entrySet().stream().filter(e -> e.getKey().equalsIgnoreCase(key)).findFirst()
.map(e -> e.getValue().toString()).orElse(null);
}
@@ -100,17 +97,13 @@ public class Response {
return this.cookies;
}
/**
* @param response template of a response
* @return builder filled with response data
*/
public static Builder from(Response response) {
return new Builder()
.headers(response.headers)
.statusCode(response.statusCode)
.cookies(response.cookies)
.body(response.body);
return new Builder().headers(response.headers).statusCode(response.statusCode).cookies(response.cookies)
.body(response.body);
}
/**

View File

@@ -368,8 +368,8 @@ class ContractHttpDocsSpec extends Specification {
String test = singleTestGenerator(optionals)
expect:
String expectedTest =
// tag::optionals_test[]
"""\
// tag::optionals_test[]
package com.example
import com.jayway.jsonpath.DocumentContext
@@ -406,9 +406,15 @@ class FooSpec extends Specification {
\t}
}
"""
// end::optionals_test[]
test.trim() == expectedTest.trim()
"""
test.trim()
.replace("\\\t", "\t") == expectedTest.trim()
.replace(" ", "\t")
.replace("\\\t", "\t")
.replace("// tag::optionals_test[]\n", "")
.replace("\n// end::optionals_test[]", "")
and:
SyntaxChecker.tryToCompile("spock", test)
}

View File

@@ -914,8 +914,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub
String test = singleTestGenerator(contractDsl)
then:
String expectedResponse =
// tag::jaxrs[]
"""\
// tag::jaxrs[]
package com.example;
import com.jayway.jsonpath.DocumentContext;
@@ -932,40 +932,45 @@ import static javax.ws.rs.client.Entity.*;
@SuppressWarnings("rawtypes")
public class FooTest {
\tWebTarget webTarget;
WebTarget webTarget;
\t@Test
\tpublic void validate_() throws Exception {
@Test
public void validate_() throws Exception {
\t\t// when:
\t\t\tResponse response = webTarget
\t\t\t\t\t\t\t.path("/users")
\t\t\t\t\t\t\t.queryParam("limit", "10")
\t\t\t\t\t\t\t.queryParam("offset", "20")
\t\t\t\t\t\t\t.queryParam("filter", "email")
\t\t\t\t\t\t\t.queryParam("sort", "name")
\t\t\t\t\t\t\t.queryParam("search", "55")
\t\t\t\t\t\t\t.queryParam("age", "99")
\t\t\t\t\t\t\t.queryParam("name", "Denis.Stepanov")
\t\t\t\t\t\t\t.queryParam("email", "bob@email.com")
\t\t\t\t\t\t\t.request()
\t\t\t\t\t\t\t.build("GET")
\t\t\t\t\t\t\t.invoke();
\t\t\tString responseAsString = response.readEntity(String.class);
// when:
Response response = webTarget
.path("/users")
.queryParam("limit", "10")
.queryParam("offset", "20")
.queryParam("filter", "email")
.queryParam("sort", "name")
.queryParam("search", "55")
.queryParam("age", "99")
.queryParam("name", "Denis.Stepanov")
.queryParam("email", "bob@email.com")
.request()
.build("GET")
.invoke();
String responseAsString = response.readEntity(String.class);
\t\t// then:
\t\t\tassertThat(response.getStatus()).isEqualTo(200);
// then:
assertThat(response.getStatus()).isEqualTo(200);
\t\t// and:
\t\t\tDocumentContext parsedJson = JsonPath.parse(responseAsString);
\t\t\tassertThatJson(parsedJson).field("['property1']").isEqualTo("a");
\t}
// and:
DocumentContext parsedJson = JsonPath.parse(responseAsString);
assertThatJson(parsedJson).field("['property1']").isEqualTo("a");
}
}
"""
// end::jaxrs[]
test.trim() == expectedResponse.trim()
"""
test.trim()
.replace("\\\t", "\t") == expectedResponse.trim()
.replace(" ", "\t")
.replace("\\\t", "\t")
.replace("// tag::jaxrs[]\n", "")
.replace("\n\n// end::jaxrs[]", "")
and:
stubMappingIsValidWireMockStub(contractDsl)
and:

View File

@@ -46,8 +46,7 @@ class SpringCloudContractRequestMatcherTests {
}
};
MatchResult result = matcher.match(BDDMockito.mock(Request.class),
Parameters.one("tool", "foo"));
MatchResult result = matcher.match(BDDMockito.mock(Request.class), Parameters.one("tool", "foo"));
BDDAssertions.then(result.isExactMatch()).isFalse();
}
@@ -64,8 +63,7 @@ class SpringCloudContractRequestMatcherTests {
}
};
MatchResult result = matcher.match(BDDMockito.mock(Request.class),
Parameters.one("contract", "value"));
MatchResult result = matcher.match(BDDMockito.mock(Request.class), Parameters.one("contract", "value"));
BDDAssertions.then(result.isExactMatch()).isFalse();
}
@@ -82,28 +80,22 @@ class SpringCloudContractRequestMatcherTests {
}
};
MatchResult result = matcher.match(BDDMockito.mock(Request.class),
Parameters.one("contract", "value"));
MatchResult result = matcher.match(BDDMockito.mock(Request.class), Parameters.one("contract", "value"));
BDDAssertions.then(result.isExactMatch()).isFalse();
}
private static final String PROPER_YAML = "---\n" + "request:\n"
+ " method: \"POST\"\n" + " url: \"/graphql\"\n" + " headers:\n"
+ " Content-Type: \"application/json\"\n" + " body:\n"
+ " query: \"query queryName($personName: String!) { personToCheck(name: $personName)"
+ " { name age } }\"\n" + " variables:\n"
+ " personName: \"Old Enough\"\n" + " operationName: \"queryName\"\n"
+ " matchers:\n" + " headers:\n" + " - key: \"Content-Type\"\n"
+ " regex: \"application/json.*\"\n"
+ " regexType: \"as_string\"\n" + "response:\n" + " status: 200\n"
private static final String PROPER_YAML = "---\n" + "request:\n" + " method: \"POST\"\n" + " url: \"/graphql\"\n"
+ " headers:\n" + " Content-Type: \"application/json\"\n" + " body:\n"
+ " data:\n" + " personToCheck:\n" + " name: \"Old Enough\"\n"
+ " age: \"40\"\n" + " matchers:\n" + " headers:\n"
+ " - key: \"Content-Type\"\n"
+ " regex: \"application/json.*\"\n"
+ " regexType: \"as_string\"\n"
+ "name: \"shouldRetrieveOldEnoughPerson\"\n" + "metadata:\n"
+ " query: \"query queryName($personName: String!) { personToCheck(name: $personName)"
+ " { name age } }\"\n" + " variables:\n" + " personName: \"Old Enough\"\n"
+ " operationName: \"queryName\"\n" + " matchers:\n" + " headers:\n"
+ " - key: \"Content-Type\"\n" + " regex: \"application/json.*\"\n"
+ " regexType: \"as_string\"\n" + "response:\n" + " status: 200\n" + " headers:\n"
+ " Content-Type: \"application/json\"\n" + " body:\n" + " data:\n" + " personToCheck:\n"
+ " name: \"Old Enough\"\n" + " age: \"40\"\n" + " matchers:\n" + " headers:\n"
+ " - key: \"Content-Type\"\n" + " regex: \"application/json.*\"\n"
+ " regexType: \"as_string\"\n" + "name: \"shouldRetrieveOldEnoughPerson\"\n" + "metadata:\n"
+ " verifier:\n" + " tool: \"graphql\"\n";
@Test
@@ -117,8 +109,8 @@ class SpringCloudContractRequestMatcherTests {
}
};
MatchResult result = matcher.match(BDDMockito.mock(Request.class), toMap(
Tuples.of("tool", "unsupported"), Tuples.of("contract", PROPER_YAML)));
MatchResult result = matcher.match(BDDMockito.mock(Request.class),
toMap(Tuples.of("tool", "unsupported"), Tuples.of("contract", PROPER_YAML)));
BDDAssertions.then(result.isExactMatch()).isFalse();
}
@@ -153,8 +145,7 @@ class SpringCloudContractRequestMatcherTests {
class ApplicableRequestMatcher implements RequestMatcher {
@Override
public MatchResult match(List<YamlContract> contracts, Request request,
Parameters parameters) {
public MatchResult match(List<YamlContract> contracts, Request request, Parameters parameters) {
return MatchResult.of(true);
}

View File

@@ -26,27 +26,23 @@ 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 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();
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.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);
}
}

View File

@@ -24,19 +24,17 @@ class ResponseTests {
@Test
void should_override_entries_when_using_builder_from_response() {
Response response = Response.builder()
.statusCode(200)
.header("header", "header-value")
.cookie("cookie", "cookie-value")
.build();
Response response = Response.builder().statusCode(200).header("header", "header-value")
.cookie("cookie", "cookie-value").build();
Response changedResponse = Response.from(response)
.header("header-foo", "header-bar")
.cookie("cookie-foo", "cookie-bar")
.build();
Response changedResponse = Response.from(response).header("header-foo", "header-bar")
.cookie("cookie-foo", "cookie-bar").build();
then(changedResponse.statusCode()).isEqualTo(200);
then(changedResponse.headers()).containsEntry("header-foo", "header-bar").containsEntry("header", "header-value");
then(changedResponse.cookies()).containsEntry("cookie-foo", "cookie-bar").containsEntry("cookie", "cookie-value");
then(changedResponse.headers()).containsEntry("header-foo", "header-bar").containsEntry("header",
"header-value");
then(changedResponse.cookies()).containsEntry("cookie-foo", "cookie-bar").containsEntry("cookie",
"cookie-value");
}
}