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:
@@ -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 {
|
||||
}
|
||||
|
||||
----
|
||||
====
|
||||
====
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user