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) {