Skip to content

Commit cbb92be

Browse files
committed
Fix YamlToContracts implementation.
Signed-off-by: Olga Maciaszek-Sharma <[email protected]>
1 parent 400d1f3 commit cbb92be

File tree

4 files changed

+60
-76
lines changed

4 files changed

+60
-76
lines changed

spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/DefaultWireMockStubPostProcessor.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,9 @@ public void setMetadata(StubMapping stubMapping, StubMapping stubMappingFromMeta
6767

6868
public ResponseDefinition mergedResponse(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
6969
return new ResponseDefinition(stubMapping.getResponse().getStatus(),
70-
stubMapping.getResponse().getStatusMessage(), stubMapping.getResponse()
71-
.getBody(),
72-
stubMapping.getResponse().getJsonBody(), stubMapping.getResponse()
73-
.getBase64Body(),
74-
stubMapping.getResponse().getBodyFileName(), stubMapping.getResponse()
75-
.getHeaders(),
70+
stubMapping.getResponse().getStatusMessage(), stubMapping.getResponse().getBody(),
71+
stubMapping.getResponse().getJsonBody(), stubMapping.getResponse().getBase64Body(),
72+
stubMapping.getResponse().getBodyFileName(), stubMapping.getResponse().getHeaders(),
7673
stubMapping.getResponse().getAdditionalProxyRequestHeaders(),
7774
fixedDelayMilliseconds(stubMapping, stubMappingFromMetadata),
7875
delayDistribution(stubMapping, stubMappingFromMetadata),
@@ -98,20 +95,17 @@ public Parameters transformerParameters(StubMapping stubMapping, StubMapping stu
9895

9996
public List<String> transformers(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
10097
return stubMappingFromMetadata.getResponse().getTransformers() != null
101-
? stubMappingFromMetadata.getResponse()
102-
.getTransformers() : stubMapping.getResponse().getTransformers();
98+
? stubMappingFromMetadata.getResponse().getTransformers() : stubMapping.getResponse().getTransformers();
10399
}
104100

105101
public Fault fault(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
106102
return stubMappingFromMetadata.getResponse().getFault() != null
107-
? stubMappingFromMetadata.getResponse()
108-
.getFault() : stubMapping.getResponse().getFault();
103+
? stubMappingFromMetadata.getResponse().getFault() : stubMapping.getResponse().getFault();
109104
}
110105

111106
public String proxyBaseUrl(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
112107
return stubMappingFromMetadata.getResponse().getProxyBaseUrl() != null
113-
? stubMappingFromMetadata.getResponse()
114-
.getProxyBaseUrl() : stubMapping.getResponse().getProxyBaseUrl();
108+
? stubMappingFromMetadata.getResponse().getProxyBaseUrl() : stubMapping.getResponse().getProxyBaseUrl();
115109
}
116110

117111
public String proxyUrlPrefixToRemove(StubMapping stubMapping, StubMapping stubMappingFromMetadata) {
@@ -158,15 +152,13 @@ else if (wiremock instanceof Map) {
158152

159153
@Override
160154
public boolean isApplicable(Contract contract) {
161-
boolean contains = contract.getMetadata()
162-
.containsKey(WireMockMetaData.METADATA_KEY);
155+
boolean contains = contract.getMetadata().containsKey(WireMockMetaData.METADATA_KEY);
163156
if (!contains) {
164157
return false;
165158
}
166-
Object stubMapping = WireMockMetaData.fromMetadata(contract.getMetadata())
167-
.getStubMapping();
159+
Object stubMapping = WireMockMetaData.fromMetadata(contract.getMetadata()).getStubMapping();
168160
return WireMockMetaData.APPLICABLE_CLASSES.stream()
169-
.anyMatch(aClass -> aClass.isAssignableFrom(stubMapping.getClass()));
161+
.anyMatch(aClass -> aClass.isAssignableFrom(stubMapping.getClass()));
170162
}
171163

172164
}

spring-cloud-contract-tools/spring-cloud-contract-converters/src/main/java/org/springframework/cloud/contract/verifier/wiremock/WireMockToDslConverter.java

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,12 @@ public class WireMockToDslConverter {
7171

7272
private static final JsonPointer RESPONSE_HEADERS_POINTER = JsonPointer.compile("/response/headers");
7373

74-
private static final JsonMapper OBJECT_MAPPER = JsonMapper
75-
.builder()
76-
.configure(ALLOW_JAVA_COMMENTS, true)
77-
.configure(ALLOW_YAML_COMMENTS, true)
78-
.configure(ALLOW_UNQUOTED_PROPERTY_NAMES, true)
79-
.configure(ALLOW_SINGLE_QUOTES, true)
80-
.build();
74+
private static final JsonMapper OBJECT_MAPPER = JsonMapper.builder()
75+
.configure(ALLOW_JAVA_COMMENTS, true)
76+
.configure(ALLOW_YAML_COMMENTS, true)
77+
.configure(ALLOW_UNQUOTED_PROPERTY_NAMES, true)
78+
.configure(ALLOW_SINGLE_QUOTES, true)
79+
.build();
8180

8281
/**
8382
* Returns the string content of the contract.
@@ -175,12 +174,10 @@ private String buildRequestHeaders(JsonNode wireMockStub) {
175174
fields.forEach(c -> {
176175
requestHeadersBuilder.append("header('").append(c.getKey()).append("',");
177176
ObjectNode headersNode = (ObjectNode) c.getValue().deepCopy();
178-
Iterator<Map.Entry<String, JsonNode>> headersNodeIterator = headersNode.properties()
179-
.iterator();
177+
Iterator<Map.Entry<String, JsonNode>> headersNodeIterator = headersNode.properties().iterator();
180178
if (headersNodeIterator.hasNext()) {
181179
Map.Entry<String, JsonNode> headerValue = headersNodeIterator.next();
182-
String header = buildHeader(headerValue.getKey(), headerValue.getValue()
183-
.asString());
180+
String header = buildHeader(headerValue.getKey(), headerValue.getValue().asString());
184181
requestHeadersBuilder.append(header).append(")").append("\n");
185182
}
186183
});
@@ -191,13 +188,13 @@ private String buildRequestHeaders(JsonNode wireMockStub) {
191188

192189
private String buildHeader(String method, String value) {
193190
switch (method) {
194-
case "equalTo":
195-
return "'" + value + "'";
196-
case "contains":
197-
String regex = "^.*" + value + ".*$";
198-
return "c(regex('" + escapeJava(regex) + "'))";
199-
default:
200-
return "c(regex('" + escapeJava(value) + "'))";
191+
case "equalTo":
192+
return "'" + value + "'";
193+
case "contains":
194+
String regex = "^.*" + value + ".*$";
195+
return "c(regex('" + escapeJava(regex) + "'))";
196+
default:
197+
return "c(regex('" + escapeJava(value) + "'))";
201198
}
202199
}
203200

@@ -210,29 +207,26 @@ private String buildRequestBody(JsonNode wireMockStub) {
210207
List<Map.Entry<String, JsonNode>> requestBodyObjectNodes = new ArrayList<>();
211208

212209
elements.stream()
213-
.filter(f -> f instanceof ObjectNode)
214-
.map(f -> (ObjectNode) f)
215-
.map(ObjectNode::properties)
216-
.forEachOrdered(requestBodyObjectNodes::addAll);
210+
.filter(f -> f instanceof ObjectNode)
211+
.map(f -> (ObjectNode) f)
212+
.map(ObjectNode::properties)
213+
.forEachOrdered(requestBodyObjectNodes::addAll);
217214
requestBodyObjectNodes.stream()
218-
.filter(b -> b.getKey().equals("equalTo"))
219-
.findFirst()
220-
.ifPresent(b -> requestBody.append("body ('")
221-
.append(b.getValue().asString()).append("')"));
215+
.filter(b -> b.getKey().equals("equalTo"))
216+
.findFirst()
217+
.ifPresent(b -> requestBody.append("body ('").append(b.getValue().asString()).append("')"));
222218
requestBodyObjectNodes.stream()
223-
.filter(b -> b.getKey().equals("equalToJson"))
224-
.findFirst()
225-
.ifPresent(b -> requestBody.append("body ('")
226-
.append(b.getValue().asString()).append("')"));
219+
.filter(b -> b.getKey().equals("equalToJson"))
220+
.findFirst()
221+
.ifPresent(b -> requestBody.append("body ('").append(b.getValue().asString()).append("')"));
227222
requestBodyObjectNodes.stream()
228-
.filter(b -> b.getKey().equals("matches"))
229-
.findFirst()
230-
.ifPresent(b -> requestBody.append("body $(consumer(regex('")
231-
.append(escapeJava(b.getValue().asString()))
232-
.append("')), producer('")
233-
.append(new Xeger(escapeJava(b.getValue()
234-
.asString())).generate())
235-
.append("'))"));
223+
.filter(b -> b.getKey().equals("matches"))
224+
.findFirst()
225+
.ifPresent(b -> requestBody.append("body $(consumer(regex('")
226+
.append(escapeJava(b.getValue().asString()))
227+
.append("')), producer('")
228+
.append(new Xeger(escapeJava(b.getValue().asString())).generate())
229+
.append("'))"));
236230
}
237231
return requestBody.toString();
238232
}
@@ -267,16 +261,12 @@ private String buildPrettyPrintResponseBody(IntNode node) {
267261
private String buildPrettyPrintResponseBody(StringNode node) {
268262
try {
269263
String stringNode = node.asString();
270-
Object intermediateObjectForPrettyPrinting =
271-
OBJECT_MAPPER.readerFor(Object.class).readValue(stringNode);
264+
Object intermediateObjectForPrettyPrinting = OBJECT_MAPPER.readerFor(Object.class).readValue(stringNode);
272265

273266
DefaultIndenter customIndenter = new DefaultIndenter(" ", "\n");
274-
return OBJECT_MAPPER
275-
.writer()
276-
.with(new DefaultPrettyPrinter()
277-
.withArrayIndenter(customIndenter)
278-
.withObjectIndenter(customIndenter))
279-
.writeValueAsString(intermediateObjectForPrettyPrinting);
267+
return OBJECT_MAPPER.writer()
268+
.with(new DefaultPrettyPrinter().withArrayIndenter(customIndenter).withObjectIndenter(customIndenter))
269+
.writeValueAsString(intermediateObjectForPrettyPrinting);
280270
}
281271
catch (Exception e) {
282272
throw new RuntimeException("WireMock response body could not be pretty printed", e);
@@ -292,11 +282,11 @@ private String buildResponseHeaders(JsonNode wireMockStub) {
292282
JsonNode responseHeadersObjectNode = requestHeadersNode.deepCopy();
293283
Set<Map.Entry<String, JsonNode>> fields = responseHeadersObjectNode.properties();
294284
fields.forEach(c -> responseHeadersBuilder.append("header('")
295-
.append(c.getKey())
296-
.append("',")
297-
.append("'")
298-
.append(c.getValue().asString())
299-
.append("')\n"));
285+
.append(c.getKey())
286+
.append("',")
287+
.append("'")
288+
.append(c.getValue().asString())
289+
.append("')\n"));
300290
responseHeadersBuilder.append("}");
301291
}
302292
return responseHeadersBuilder.toString();

spring-cloud-contract-tools/spring-cloud-contract-converters/src/test/java/org/springframework/cloud/contract/verifier/wiremock/DefaultWireMockStubPostProcessorTests.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,13 @@ private void thenPostServerActionWasSet(StubMapping result) {
151151
then(result.getRequest().getMethod().getName()).isEqualTo("GET");
152152
then(result.getResponse().getStatus()).isEqualTo(200);
153153
then(result.getResponse().getBody()).isEqualTo("pong");
154-
then(result.getPostServeActions().stream().map(a -> a.getName())
155-
.collect(Collectors.toList()))
156-
.contains("webhook");
154+
then(result.getPostServeActions().stream().map(a -> a.getName()).collect(Collectors.toList()))
155+
.contains("webhook");
157156
PostServeActionDefinition definition = result.getPostServeActions()
158-
.stream()
159-
.filter(a -> a.getName().equals("webhook"))
160-
.findFirst()
161-
.orElseThrow(() -> new AssertionError("No webhook action found"));
157+
.stream()
158+
.filter(a -> a.getName().equals("webhook"))
159+
.findFirst()
160+
.orElseThrow(() -> new AssertionError("No webhook action found"));
162161
then(definition.getParameters().getString("method")).isEqualTo("POST");
163162
}
164163

spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/converter/YamlToContracts.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
import org.apache.commons.collections.MapUtils;
4242
import org.yaml.snakeyaml.Yaml;
43+
import tools.jackson.databind.DeserializationFeature;
4344
import tools.jackson.databind.ObjectMapper;
4445
import tools.jackson.databind.exc.MismatchedInputException;
4546
import tools.jackson.dataformat.yaml.YAMLMapper;
@@ -75,7 +76,9 @@ class YamlToContracts {
7576

7677
Collection<Contract> convertFrom(File contractFile) {
7778
ClassLoader classLoader = YamlContractConverter.class.getClassLoader();
78-
YAMLMapper mapper = new YAMLMapper();
79+
YAMLMapper mapper = YAMLMapper.builder()
80+
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true)
81+
.build();
7982
try {
8083
Iterable<Object> iterables = new Yaml().loadAll(Files.newInputStream(contractFile.toPath()));
8184
Collection<Contract> contracts = new ArrayList<>();

0 commit comments

Comments
 (0)