From f34039bbfbaff2d5e3e9089cfd42a33273f6dbbd Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 8 Feb 2017 14:02:29 +0100 Subject: [PATCH] Added SpringCloudContractAssertions we're hiding the details related to assertions in our new abstraction over assertj assertions. That way we'll be able to add new methods in an easy way. There will be no need to create annonymous conditions etc. --- .../contract/maven/verifier/PluginIT.java | 13 ---- .../test/projects/plugin-extension/pom.xml | 26 ++------ .../test/projects/spring-boot-groovy/pom.xml | 20 ++---- .../test/projects/spring-boot-java/pom.xml | 26 ++------ .../verifier/builder/JavaTestGenerator.groovy | 2 +- .../verifier/builder/MethodBodyBuilder.groovy | 14 +--- .../verifier/assertion/CollectionAssert.java | 38 +++++++++++ .../SpringCloudContractAssertions.java | 22 +++++++ .../assertion/CollectionAssertTests.java | 66 +++++++++++++++++++ ...vcMethodBodyBuilderWithMatchersSpec.groovy | 6 +- .../verifier/util/SyntaxChecker.groovy | 2 +- 11 files changed, 142 insertions(+), 93 deletions(-) create mode 100644 spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/CollectionAssert.java create mode 100644 spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/SpringCloudContractAssertions.java create mode 100644 spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/assertion/CollectionAssertTests.java diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginIT.java b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginIT.java index c2e87797e8..becdcda07e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginIT.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/java/org/springframework/cloud/contract/maven/verifier/PluginIT.java @@ -20,7 +20,6 @@ import java.io.File; import org.junit.Assume; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -97,18 +96,6 @@ public class PluginIT { .assertErrorFreeLog(); } - @Test - @Ignore("Ignored, because of bug accurest#245") - public void should_build_project_project_with_complex_configuration() throws Exception { - File basedir = this.resources.getBasedir("complex-configuration"); - this.maven.forProject(basedir) - .execute("package") - .assertErrorFreeLog() - .assertLogText("Tests run: 2, Failures: 0, Errors: 0, Skipped: 1") - .assertLogText("Running com.blogspot.toomuchcoding.frauddetection.ContractVerifierTest") - .assertErrorFreeLog(); - } - @Test public void should_convert_Accurest_Contracts_to_WireMock_Stubs_mappings() throws Exception { File basedir = this.resources.getBasedir("pomless"); diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml index e03b81bc7a..2bba9a460e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/plugin-extension/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 1.3.5.RELEASE + 1.5.1.RELEASE @@ -49,27 +49,9 @@ - com.jayway.restassured - rest-assured - 2.9.0 - test - - - com.jayway.restassured - spring-mock-mvc - 2.9.0 - test - - - com.toomuchcoding.jsonassert - jsonassert - 0.4.8 - test - - - org.assertj - assertj-core - 2.4.1 + org.springframework.cloud + spring-cloud-starter-contract-verifier + ${it-plugin.version} test diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml index a0dc42aa9d..a3c3e94dd2 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-groovy/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 1.3.5.RELEASE + 1.5.1.RELEASE @@ -50,21 +50,9 @@ test - com.jayway.restassured - rest-assured - 2.9.0 - test - - - com.jayway.restassured - spring-mock-mvc - 2.9.0 - test - - - com.toomuchcoding.jsonassert - jsonassert - 0.4.8 + org.springframework.cloud + spring-cloud-starter-contract-verifier + ${it-plugin.version} test diff --git a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml index e03b81bc7a..2bba9a460e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-maven-plugin/src/test/projects/spring-boot-java/pom.xml @@ -28,7 +28,7 @@ org.springframework.boot spring-boot-starter-parent - 1.3.5.RELEASE + 1.5.1.RELEASE @@ -49,27 +49,9 @@ - com.jayway.restassured - rest-assured - 2.9.0 - test - - - com.jayway.restassured - spring-mock-mvc - 2.9.0 - test - - - com.toomuchcoding.jsonassert - jsonassert - 0.4.8 - test - - - org.assertj - assertj-core - 2.4.1 + org.springframework.cloud + spring-cloud-starter-contract-verifier + ${it-plugin.version} test diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JavaTestGenerator.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JavaTestGenerator.groovy index b35aabfa5a..b375556fe4 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JavaTestGenerator.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JavaTestGenerator.groovy @@ -88,7 +88,7 @@ class JavaTestGenerator implements SingleTestGenerator { clazz.addImport('com.jayway.restassured.response.Response') } clazz.addImport('org.junit.Test') - clazz.addStaticImport('org.assertj.core.api.Assertions.assertThat') + clazz.addStaticImport('org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat') } if (configProperties.ruleClassForTests) { clazz.addImport('org.junit.Rule').addRule(configProperties.ruleClassForTests) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy index d8ec47e8a0..b01af2283f 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy @@ -342,20 +342,8 @@ abstract class MethodBodyBuilder { } protected void buildCustomMatchingConditionForEachElement(BlockBuilder bb, String path, String valueAsParam) { - String method = "assertThat(parsedJson.read(${path}, java.util.Collection.class)).as(\"All elements match regex\").are(" - String newCondition = "new org.assertj.core.api.Condition() {" - String overriddenMethod = "@Override public boolean matches(Object o) {" - String matches = "return ((String)o).matches(${valueAsParam})" - String methodEnd = "}" - String classEnd = "})" + String method = "assertThat(parsedJson.read(${path}, java.util.Collection.class)).allElementsMatch(${valueAsParam})" bb.addLine(postProcessJsonPathCall(method)) - bb.startBlock().startBlock().addLine(newCondition) - bb.startBlock().addLine(overriddenMethod) - bb.startBlock().addLine(postProcessJsonPathCall(matches)) - addColonIfRequired(bb) - bb.endBlock().addLine(methodEnd) - bb.endBlock().addLine(classEnd) - bb.endBlock().endBlock() } protected Object value(def body, BodyMatcher bodyMatcher) { diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/CollectionAssert.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/CollectionAssert.java new file mode 100644 index 0000000000..013ad19494 --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/CollectionAssert.java @@ -0,0 +1,38 @@ +package org.springframework.cloud.contract.verifier.assertion; + +import java.util.Iterator; + +import org.assertj.core.api.IterableAssert; + +/** + * Extension to {@link Iterable} assertions + * + * @author Marcin Grzejszczak + * @since 1.1.0 + */ +public class CollectionAssert extends IterableAssert { + public CollectionAssert(Iterable actual) { + super(actual); + } + + public CollectionAssert(Iterator actual) { + super(actual); + } + + /** + * Asserts all elements of the collection whether they match a regular expression + * @param regex - regular expression to check against + * @return this + */ + public CollectionAssert allElementsMatch(String regex) { + isNotNull(); + isNotEmpty(); + for (Object anActual : this.actual) { + String value = anActual.toString(); + if (!value.matches(regex)) { + failWithMessage("The value <%s> doesn't match the regex <%s>", value, regex); + } + } + return this; + } +} diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/SpringCloudContractAssertions.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/SpringCloudContractAssertions.java new file mode 100644 index 0000000000..69dd8acbf5 --- /dev/null +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/assertion/SpringCloudContractAssertions.java @@ -0,0 +1,22 @@ +package org.springframework.cloud.contract.verifier.assertion; + +import org.assertj.core.api.Assertions; + +/** + * Assertions used by the generated tests + * + * @author Marcin Grzejszczak + * @since 1.1.0 + */ +public class SpringCloudContractAssertions extends Assertions { + + /** + * Creates a new instance of {@link CollectionAssert}. + * + * @param actual the actual value. + * @return the created assertion object. + */ + public static CollectionAssert assertThat(Iterable actual) { + return new CollectionAssert<>(actual); + } +} diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/assertion/CollectionAssertTests.java b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/assertion/CollectionAssertTests.java new file mode 100644 index 0000000000..f8854e232a --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/assertion/CollectionAssertTests.java @@ -0,0 +1,66 @@ +package org.springframework.cloud.contract.verifier.assertion; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.assertj.core.api.Assertions; +import org.junit.Test; + +/** + * @author Marcin Grzejszczak + */ +public class CollectionAssertTests { + + @Test + public void should_not_throw_an_exception_when_all_elements_match_regex() { + Collection collection = collection(); + + SpringCloudContractAssertions.assertThat(collection).allElementsMatch("[a-z]"); + } + + @Test + public void should_throw_an_exception_when_at_least_one_element_doesnt_match_regex() { + Collection collection = collection(); + + try { + SpringCloudContractAssertions.assertThat(collection).allElementsMatch("[0-9]"); + Assertions.fail("should throw exception"); + } catch (AssertionError e) { + Assertions.assertThat(e).hasMessageContaining("The value doesn't match the regex <[0-9]>"); + } + } + + @Test + public void should_throw_an_exception_when_collection_is_null() { + Collection collection = null; + + try { + SpringCloudContractAssertions.assertThat(collection).allElementsMatch("foo"); + Assertions.fail("should throw exception"); + } catch (AssertionError e) { + Assertions.assertThat(e).hasMessageContaining("Expecting actual not to be null"); + } + } + + @Test + public void should_throw_an_exception_when_collection_is_empty() { + Collection collection = new ArrayList(); + + try { + SpringCloudContractAssertions.assertThat(collection).allElementsMatch("foo"); + Assertions.fail("should throw exception"); + } catch (AssertionError e) { + Assertions.assertThat(e).hasMessageContaining("Expecting actual not to be empty"); + } + } + + private Collection collection() { + List list = new ArrayList<>(); + list.add("a"); + list.add("b"); + list.add("c"); + return list; + } + +} \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy index 08f66302f7..800a53b98c 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy @@ -222,11 +222,7 @@ class MockMvcMethodBodyBuilderWithMatchersSpec extends Specification implements builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains('assertThat(parsedJson.read("' + rootElement + '.phoneNumbers[*].number", java.util.Collection.class)).as("All elements match regex").are(') - test.contains('new org.assertj.core.api.Condition() {') - test.contains('@Override public boolean matches(Object o) {') - test.contains('return ((String)o).matches("^[0-9]{3} [0-9]{3}-[0-9]{4}' + rootElement + '")') - test.contains('assertThat(parsedJson.read("' + rootElement + '..number", String.class)).matches("^[0-9]{3} [0-9]{3}-[0-9]{4}' + rootElement + '")') + test.contains('assertThat(parsedJson.read("' + rootElement + '.phoneNumbers[*].number", java.util.Collection.class)).allElementsMatch("^[0-9]{3} [0-9]{3}-[0-9]{4}' + rootElement + '")') !test.contains('cursor') and: try { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy index 8a71f78cf1..69a63d006d 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy @@ -40,7 +40,7 @@ class SyntaxChecker { "javax.ws.rs.client.Entity.*", "org.springframework.cloud.contract.verifier.messaging.util.ContractVerifierMessagingUtil.headers", "com.toomuchcoding.jsonassert.JsonAssertion.assertThatJson", - "org.assertj.core.api.Assertions.assertThat" + "org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat" ].collect { "import static ${it};"}.join("\n") static void tryToCompile(String builderName, String test) {