From 74b97648eebf7e55006722b1d9ceefbc8cefdee0 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 15:37:09 +0200 Subject: [PATCH 1/3] Polish --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0f74b6cf02..5eed16c58b 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ hs_err_pid* .gradle/ target/ build/ +out/ hs_err_pid* .DS_Store From 9fe36dc7479589310aa45ddbf6fce31bfaca122d Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 15:50:24 +0200 Subject: [PATCH 2/3] Added compatibility with WireMock helpers --- .../HandlebarsJsonPathHelper.groovy | 43 +++++++++++++++---- .../HandlebarsTemplateProcessor.groovy | 7 +++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy index 35ac89d92e..dffc6c9f72 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy @@ -1,5 +1,6 @@ package org.springframework.cloud.contract.verifier.builder.handlebars +import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.WireMockHelpers import wiremock.com.github.jknack.handlebars.Helper import wiremock.com.github.jknack.handlebars.Options import com.github.tomakehurst.wiremock.extension.responsetemplating.RequestTemplateModel @@ -22,14 +23,34 @@ class HandlebarsJsonPathHelper implements Helper> { @Override Object apply(Map context, Options options) throws IOException { - String jsonPath = options.param(0) - Object model = context.get(REQUEST_MODEL_NAME) - if (model instanceof TestSideRequestTemplateModel) { - return returnObjectForTest(model, jsonPath) - } else if (model instanceof RequestTemplateModel) { - return returnObjectForStub(model, jsonPath) + if (context instanceof Map) { + // legacy + Map oldContext = (Map) context + String jsonPath = options.param(0) + Object model = oldContext.get(REQUEST_MODEL_NAME) + if (model instanceof TestSideRequestTemplateModel) { + return returnObjectForTest(model, jsonPath) + } else if (model instanceof RequestTemplateModel) { + return returnObjectForStub(model, jsonPath) + } + throw new IllegalArgumentException("Unsupported model") + } else if (context instanceof String) { + Object value = WireMockHelpers.jsonPath.apply(context, options) + if (testSideModel(options)) { + return processTestResponseValue(value) + } + return value } - throw new IllegalArgumentException("Unsupported model") + throw new IllegalArgumentException("Unsupported context") + } + + private boolean testSideModel(Options options) { + Object model = options.context.model() + if (!(model instanceof Map)) { + return false + } + Map map = (Map) model + return map.values().any { it instanceof TestSideRequestTemplateModel } } private Object returnObjectForStub(Object model, String jsonPath) { @@ -37,10 +58,14 @@ class HandlebarsJsonPathHelper implements Helper> { return documentContext.read(jsonPath) } - private Object returnObjectForTest(Object model, String jsonPath) { - String body = removeSurroundingQuotes(((TestSideRequestTemplateModel) model).rawBody).replace('\\"', '"') + private Object returnObjectForTest(TestSideRequestTemplateModel model, String jsonPath) { + String body = removeSurroundingQuotes(model.rawBody).replace('\\"', '"') DocumentContext documentContext = JsonPath.parse(body) Object value = documentContext.read(jsonPath) + return processTestResponseValue(value) + } + + private Object processTestResponseValue(Object value) { if (value instanceof Long) { return String.valueOf(value) + "L" } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy index fa9c5d575a..a2f4b4b533 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/template/HandlebarsTemplateProcessor.groovy @@ -1,5 +1,6 @@ package org.springframework.cloud.contract.verifier.template +import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.WireMockHelpers import wiremock.com.github.jknack.handlebars.Handlebars import wiremock.com.github.jknack.handlebars.Template import groovy.transform.CompileStatic @@ -71,6 +72,12 @@ class HandlebarsTemplateProcessor implements TemplateProcessor, ContractTemplate try { Handlebars handlebars = new Handlebars() handlebars.registerHelper(HandlebarsJsonPathHelper.NAME, new HandlebarsJsonPathHelper()) + handlebars.registerHelper(WireMockHelpers.jsonPath.name(), new HandlebarsJsonPathHelper()) + WireMockHelpers.values() + .findAll { it != WireMockHelpers.jsonPath} + .each { WireMockHelpers helper -> + handlebars.registerHelper(helper.name(), helper) + } return handlebars.compileInline(content) } catch (IOException e) { throw new RuntimeException(e) From cfc9d6fbb5af7523f409b783de891061821472eb Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 29 Aug 2018 15:51:27 +0200 Subject: [PATCH 3/3] Added NPE guard; fixes gh-717 --- .../contract/wiremock/restdocs/ContractExchangeHandler.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java index f1dc5e56f3..669f8b66f2 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/ContractExchangeHandler.java @@ -194,7 +194,11 @@ class WireMockHttpRequestAdapter implements Request { return null; } List values = new ArrayList<>(); - for (String name : StringUtils.split(query, "&")) { + String[] strings = StringUtils.split(query, "&"); + if (strings == null) { + return null; + } + for (String name : strings) { if (name.equals(key)) { values.add(""); }