From 305452c54abd6de4ce0e19c048a859c5841e1e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mariusz=20Smyku=C5=82a?= Date: Tue, 26 Apr 2016 16:34:15 +0200 Subject: [PATCH] Feature/complex test configuration (#16) * custom imports support * add missing options to generateTests --- .../accurest/maven/GenerateTestsMojo.groovy | 29 +++++ src/site/asciidoc/complex.adoc | 38 ++++++ src/site/site.xml | 1 + .../io/codearte/accurest/maven/PluginIT.java | 14 +++ .../accurest/maven/PluginUnitTest.java | 9 ++ .../projects/complex-configuration/.gitignore | 1 + .../projects/complex-configuration/pom.xml | 112 ++++++++++++++++++ .../frauddetection/Application.java | 12 ++ .../FraudDetectionController.java | 39 ++++++ .../frauddetection/model/FraudCheck.java | 29 +++++ .../model/FraudCheckResult.java | 32 +++++ .../model/FraudCheckStatus.java | 5 + .../src/test/accurest/brokenContract.groovy | 28 +++++ .../accurest/shouldMarkClientAsFraud.groovy | 27 +++++ .../shouldMarkClientAsNotFraud.groovy | 28 +++++ .../frauddetection/BaseAccurest.java | 14 +++ .../matchers/CustomMatchers.java | 11 ++ .../src/test/accurest/greetings_ok.json | 21 ---- .../greetings_with_default_value.json | 16 --- 19 files changed, 429 insertions(+), 37 deletions(-) create mode 100644 src/site/asciidoc/complex.adoc create mode 100644 src/test/projects/complex-configuration/.gitignore create mode 100644 src/test/projects/complex-configuration/pom.xml create mode 100644 src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/Application.java create mode 100644 src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/FraudDetectionController.java create mode 100644 src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheck.java create mode 100644 src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheckResult.java create mode 100644 src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheckStatus.java create mode 100644 src/test/projects/complex-configuration/src/test/accurest/brokenContract.groovy create mode 100644 src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsFraud.groovy create mode 100644 src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsNotFraud.groovy create mode 100644 src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/BaseAccurest.java create mode 100644 src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/matchers/CustomMatchers.java delete mode 100644 src/test/projects/spring-boot-java/src/test/accurest/greetings_ok.json delete mode 100644 src/test/projects/spring-boot-java/src/test/accurest/greetings_with_default_value.json diff --git a/src/main/groovy/io/codearte/accurest/maven/GenerateTestsMojo.groovy b/src/main/groovy/io/codearte/accurest/maven/GenerateTestsMojo.groovy index cef5361d73..c68bdc32c2 100644 --- a/src/main/groovy/io/codearte/accurest/maven/GenerateTestsMojo.groovy +++ b/src/main/groovy/io/codearte/accurest/maven/GenerateTestsMojo.groovy @@ -45,6 +45,30 @@ class GenerateTestsMojo extends AbstractMojo { @Parameter private String nameSuffixForTests + /** + * Imports that should be added to generated tests + */ + @Parameter + private String[] imports + + /** + * Static imports that should be added to generated tests + */ + @Parameter + private String[] staticImports + + /** + * Patterns that should not be taken into account for processing + */ + @Parameter + List excludedFiles + + /** + * Patterns for which Accurest should generate @Ignored tests + */ + @Parameter + List ignoredFiles + @Parameter(defaultValue = '${project}', readonly = true) private MavenProject project @@ -70,6 +94,11 @@ class GenerateTestsMojo extends AbstractMojo { config.ruleClassForTests = ruleClassForTests config.nameSuffixForTests = nameSuffixForTests + config.setImports(imports) + config.setStaticImports(staticImports) + config.setIgnoredFiles(ignoredFiles) + config.setExcludedFiles(excludedFiles) + project.addTestCompileSourceRoot(generatedTestSourcesDir.absolutePath) if (log.isInfoEnabled()) { diff --git a/src/site/asciidoc/complex.adoc b/src/site/asciidoc/complex.adoc new file mode 100644 index 0000000000..cb90a65901 --- /dev/null +++ b/src/site/asciidoc/complex.adoc @@ -0,0 +1,38 @@ +== More Complex Plugin Configuration + +Sample more complex configuration for Java Project with JUnit tests. + + +=== Project configuration for Accurest with JUnit tests and stub publishing + +[source,xml] +---- +include::../../../src/test/projects/complex-configuration/pom.xml[tags=plugin] +---- + +=== Base Test class + +[source,java] +---- +include::../../../src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/BaseAccurest.java[] +---- + + +=== Sample additional matcher + +[source,java] +---- +include::../../../src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/matchers/CustomMatchers.java[] +---- + +=== Sample contract using matcher + +[source,java] +---- +include::../../../src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsNotFraud.groovy[] +---- + + +=== Project source code + +https://github.com/Codearte/accurest-maven-plugin/tree/master/src/test/projects/complex-configuration \ No newline at end of file diff --git a/src/site/site.xml b/src/site/site.xml index 005d021238..a05826b4f6 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -30,6 +30,7 @@ + diff --git a/src/test/java/io/codearte/accurest/maven/PluginIT.java b/src/test/java/io/codearte/accurest/maven/PluginIT.java index b1e5415683..4a4e396f46 100644 --- a/src/test/java/io/codearte/accurest/maven/PluginIT.java +++ b/src/test/java/io/codearte/accurest/maven/PluginIT.java @@ -1,7 +1,9 @@ package io.codearte.accurest.maven; import java.io.File; +import java.util.regex.Pattern; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -55,6 +57,18 @@ 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 = resources.getBasedir("complex-configuration"); + maven.forProject(basedir) + .execute("package") + .assertErrorFreeLog() + .assertLogText("Tests run: 2, Failures: 0, Errors: 0, Skipped: 1") + .assertLogText("Running com.blogspot.toomuchcoding.frauddetection.AccurestTest") + .assertErrorFreeLog(); + } + @Test public void should_convert_Accurest_Contracts_to_WireMock_Stubs_mappings() throws Exception { File basedir = resources.getBasedir("pomless"); diff --git a/src/test/java/io/codearte/accurest/maven/PluginUnitTest.java b/src/test/java/io/codearte/accurest/maven/PluginUnitTest.java index 5ade936531..47b3c659a3 100644 --- a/src/test/java/io/codearte/accurest/maven/PluginUnitTest.java +++ b/src/test/java/io/codearte/accurest/maven/PluginUnitTest.java @@ -5,6 +5,7 @@ import static io.takari.maven.testing.TestResources.assertFileContents; import static io.takari.maven.testing.TestResources.assertFilesPresent; import java.io.File; +import java.util.Arrays; import org.junit.Rule; import org.junit.Test; @@ -57,6 +58,14 @@ public class PluginUnitTest { "target/generated-test-sources/accurest/io/codearte/accurest/tests/AccurestTest.java"); } + @Test + public void shouldGenerateContractTestsWithCustomImports() throws Exception { + File basedir = resources.getBasedir("basic"); + maven.executeMojo(basedir, "generateTests", newParameter("imports", "")); + assertFilesPresent(basedir, + "target/generated-test-sources/accurest/io/codearte/accurest/tests/AccurestTest.java"); + } + @Test public void shouldGenerateStubs() throws Exception { File basedir = resources.getBasedir("generatedStubs"); diff --git a/src/test/projects/complex-configuration/.gitignore b/src/test/projects/complex-configuration/.gitignore new file mode 100644 index 0000000000..1de565933b --- /dev/null +++ b/src/test/projects/complex-configuration/.gitignore @@ -0,0 +1 @@ +target \ No newline at end of file diff --git a/src/test/projects/complex-configuration/pom.xml b/src/test/projects/complex-configuration/pom.xml new file mode 100644 index 0000000000..756ca7d8f1 --- /dev/null +++ b/src/test/projects/complex-configuration/pom.xml @@ -0,0 +1,112 @@ + + + 4.0.0 + + com.blogspot.toomuchcoding.frauddetection + frauddetection + 0.1.0 + + + org.springframework.boot + spring-boot-starter-parent + 1.3.3.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + test + + + ch.qos.logback + logback-classic + + + + + + com.jayway.restassured + rest-assured + 2.9.0 + test + + + com.jayway.restassured + spring-mock-mvc + 2.9.0 + test + + + com.toomuchcoding.jsonassert + jsonassert + 0.3.0 + test + + + org.assertj + assertj-core + 2.3.0 + test + + + + + + 1.8 + ${it-plugin.version} + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + io.codearte.accurest + accurest-maven-plugin + ${accurest-plugin.version} + + + + convert + generateStubs + generateTests + + + com.blogspot.toomuchcoding.frauddetection + MOCKMVC + JUNIT + stubs + Test + org.junit.rules.ErrorCollector + + com.blogspot.toomuchcoding.frauddetection.matchers.CustomMatchers.* + + + com.blogspot.toomuchcoding.frauddetection.matchers.CustomMatchers + + + broken** + + + shouldMarkClientAsFraud.groovy + + + + + + com.blogspot.toomuchcoding.frauddetection.BaseAccurest + + + + + + diff --git a/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/Application.java b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/Application.java new file mode 100644 index 0000000000..9ba071ba43 --- /dev/null +++ b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/Application.java @@ -0,0 +1,12 @@ +package com.blogspot.toomuchcoding.frauddetection; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/FraudDetectionController.java b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/FraudDetectionController.java new file mode 100644 index 0000000000..e264462cce --- /dev/null +++ b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/FraudDetectionController.java @@ -0,0 +1,39 @@ +package com.blogspot.toomuchcoding.frauddetection; + +import com.blogspot.toomuchcoding.frauddetection.model.FraudCheck; +import com.blogspot.toomuchcoding.frauddetection.model.FraudCheckResult; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; + +import static com.blogspot.toomuchcoding.frauddetection.model.FraudCheckStatus.FRAUD; +import static com.blogspot.toomuchcoding.frauddetection.model.FraudCheckStatus.OK; +import static org.springframework.web.bind.annotation.RequestMethod.PUT; + +@RestController +public class FraudDetectionController { + + private static final String FRAUD_SERVICE_JSON_VERSION_1 = "application/vnd.fraud.v1+json"; + private static final String NO_REASON = null; + private static final String AMOUNT_TOO_HIGH = "Amount too high"; + private static final BigDecimal MAX_AMOUNT = new BigDecimal("5000"); + + @RequestMapping( + value = "/fraudcheck", + method = PUT, + consumes = FRAUD_SERVICE_JSON_VERSION_1, + produces = FRAUD_SERVICE_JSON_VERSION_1) + public FraudCheckResult fraudCheck(@RequestBody FraudCheck fraudCheck) { + if (amountGreaterThanThreshold(fraudCheck)) { + return new FraudCheckResult(FRAUD, AMOUNT_TOO_HIGH); + } + return new FraudCheckResult(OK, NO_REASON); + } + + private boolean amountGreaterThanThreshold(FraudCheck fraudCheck) { + return MAX_AMOUNT.compareTo(fraudCheck.getLoanAmount()) < 0; + } + +} diff --git a/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheck.java b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheck.java new file mode 100644 index 0000000000..77471aee19 --- /dev/null +++ b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheck.java @@ -0,0 +1,29 @@ +package com.blogspot.toomuchcoding.frauddetection.model; + +import java.math.BigDecimal; + +public class FraudCheck { + + private String clientPesel; + + private BigDecimal loanAmount; + + public FraudCheck() { + } + + public String getClientPesel() { + return clientPesel; + } + + public void setClientPesel(String clientPesel) { + this.clientPesel = clientPesel; + } + + public BigDecimal getLoanAmount() { + return loanAmount; + } + + public void setLoanAmount(BigDecimal loanAmount) { + this.loanAmount = loanAmount; + } +} diff --git a/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheckResult.java b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheckResult.java new file mode 100644 index 0000000000..28efc573f5 --- /dev/null +++ b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheckResult.java @@ -0,0 +1,32 @@ +package com.blogspot.toomuchcoding.frauddetection.model; + +public class FraudCheckResult { + + private FraudCheckStatus fraudCheckStatus; + + private String rejectionReason; + + public FraudCheckResult() { + } + + public FraudCheckResult(FraudCheckStatus fraudCheckStatus, String rejectionReason) { + this.fraudCheckStatus = fraudCheckStatus; + this.rejectionReason = rejectionReason; + } + + public FraudCheckStatus getFraudCheckStatus() { + return fraudCheckStatus; + } + + public void setFraudCheckStatus(FraudCheckStatus fraudCheckStatus) { + this.fraudCheckStatus = fraudCheckStatus; + } + + public String getRejectionReason() { + return rejectionReason; + } + + public void setRejectionReason(String rejectionReason) { + this.rejectionReason = rejectionReason; + } +} diff --git a/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheckStatus.java b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheckStatus.java new file mode 100644 index 0000000000..b87c365d51 --- /dev/null +++ b/src/test/projects/complex-configuration/src/main/java/com/blogspot/toomuchcoding/frauddetection/model/FraudCheckStatus.java @@ -0,0 +1,5 @@ +package com.blogspot.toomuchcoding.frauddetection.model; + +public enum FraudCheckStatus { + OK, FRAUD +} diff --git a/src/test/projects/complex-configuration/src/test/accurest/brokenContract.groovy b/src/test/projects/complex-configuration/src/test/accurest/brokenContract.groovy new file mode 100644 index 0000000000..cd810a29dc --- /dev/null +++ b/src/test/projects/complex-configuration/src/test/accurest/brokenContract.groovy @@ -0,0 +1,28 @@ +io.codearte.accurest.dsl.GroovyDsl.make { + request { + method 'PUT' + url '/fraudcheck' + body(""" + { + "clientPesel":"${value(client(regex('[0-9]{10}')), server('1234567890'))}", + "loanAmount":123.123 + } + """ + ) + headers { + header('Content-Type', 'application/vnd.fraud.v1+json') + } + + } + response { + status 999 + body( + fraudCheckStatus: "OK", + rejectionReason: $(client(null), server(execute('assertThatRejectionReasonIsNull($it)'))) + ) + headers { + header('Content-Type': 'application/vnd.fraud.v1+json') + } + } + +} diff --git a/src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsFraud.groovy b/src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsFraud.groovy new file mode 100644 index 0000000000..44b1c08604 --- /dev/null +++ b/src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsFraud.groovy @@ -0,0 +1,27 @@ +io.codearte.accurest.dsl.GroovyDsl.make { + request { + method """PUT""" + url """/fraudcheck""" + body(""" + { + "clientPesel":"${value(client(regex('[0-9]{10}')), server('1234567890'))}", + "loanAmount":99999} + """ + ) + headers { + header("""Content-Type""", """application/vnd.fraud.v1+json""") + } + + } + response { + status 200 + body( """{ + "fraudCheckStatus": "${value(client('FRAUD'), server(regex('[A-Z]{5}')))}", + "rejectionReason": "Amount too high" +}""") + headers { + header('Content-Type': 'application/vnd.fraud.v1+json') + } + } + +} diff --git a/src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsNotFraud.groovy b/src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsNotFraud.groovy new file mode 100644 index 0000000000..7bc64d0dac --- /dev/null +++ b/src/test/projects/complex-configuration/src/test/accurest/shouldMarkClientAsNotFraud.groovy @@ -0,0 +1,28 @@ +io.codearte.accurest.dsl.GroovyDsl.make { + request { + method 'PUT' + url '/fraudcheck' + body(""" + { + "clientPesel":"${value(client(regex('[0-9]{10}')), server('1234567890'))}", + "loanAmount":123.123 + } + """ + ) + headers { + header('Content-Type', 'application/vnd.fraud.v1+json') + } + + } + response { + status 200 + body( + fraudCheckStatus: "OK", + rejectionReason: $(client(null), server(execute('assertThatRejectionReasonIsNull($it)'))) + ) + headers { + header('Content-Type': 'application/vnd.fraud.v1+json') + } + } + +} diff --git a/src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/BaseAccurest.java b/src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/BaseAccurest.java new file mode 100644 index 0000000000..0e7194f8ed --- /dev/null +++ b/src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/BaseAccurest.java @@ -0,0 +1,14 @@ +package com.blogspot.toomuchcoding.frauddetection; + +import org.junit.Before; + +import com.jayway.restassured.module.mockmvc.RestAssuredMockMvc; + +public class BaseAccurest { + + @Before + public void setup() { + RestAssuredMockMvc.standaloneSetup(new FraudDetectionController()); + } + +} diff --git a/src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/matchers/CustomMatchers.java b/src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/matchers/CustomMatchers.java new file mode 100644 index 0000000000..a113e4ca37 --- /dev/null +++ b/src/test/projects/complex-configuration/src/test/java/com/blogspot/toomuchcoding/frauddetection/matchers/CustomMatchers.java @@ -0,0 +1,11 @@ +package com.blogspot.toomuchcoding.frauddetection.matchers; + +import org.junit.Assert; + +public class CustomMatchers { + + public static void assertThatRejectionReasonIsNull(String rejectionReason) { + Assert.assertNull(rejectionReason); + } + +} diff --git a/src/test/projects/spring-boot-java/src/test/accurest/greetings_ok.json b/src/test/projects/spring-boot-java/src/test/accurest/greetings_ok.json deleted file mode 100644 index 548fb8e723..0000000000 --- a/src/test/projects/spring-boot-java/src/test/accurest/greetings_ok.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "request" : { - "urlPath" : "/greeting", - "method" : "GET", - "headers" : { - "Content-Type" : { - "equalTo" : "application/json" - } - }, - "queryParameters" : { - "name" : { - "equalTo" : "Something" - } - } - }, - "response" : { - "status" : 200, - "body" : "{\"id\":1,\"content\":\"Hello, Something!\"}" - }, - "priority" : 2 -} \ No newline at end of file diff --git a/src/test/projects/spring-boot-java/src/test/accurest/greetings_with_default_value.json b/src/test/projects/spring-boot-java/src/test/accurest/greetings_with_default_value.json deleted file mode 100644 index e014f2ab69..0000000000 --- a/src/test/projects/spring-boot-java/src/test/accurest/greetings_with_default_value.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "request" : { - "url" : "/greeting", - "method" : "GET", - "headers" : { - "Content-Type" : { - "equalTo" : "application/json" - } - } - }, - "response" : { - "status" : 200, - "body" : "{\"id\":1,\"content\":\"Hello, World!\"}" - }, - "priority" : 2 -} \ No newline at end of file