From 1a8c1214c489555a8d842842db283e9f7d44c3c2 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 25 Jul 2016 16:53:45 +0100 Subject: [PATCH] Add support for restdocs in a crude way --- .../{ => dsl}/http-client/.gitignore | 0 .../{ => dsl}/http-client/.mvn/jvm.config | 0 .../{ => dsl}/http-client/.mvn/maven.config | 0 .../.mvn/wrapper/maven-wrapper.jar | Bin .../.mvn/wrapper/maven-wrapper.properties | 0 .../{ => dsl}/http-client/README.adoc | 0 .../{ => dsl}/http-client/build.gradle | 0 .../{ => dsl}/http-client/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../standalone/{ => dsl}/http-client/gradlew | 0 .../{ => dsl}/http-client/gradlew.bat | 0 samples/standalone/{ => dsl}/http-client/mvnw | 0 .../standalone/{ => dsl}/http-client/mvnw.cmd | 0 .../standalone/{ => dsl}/http-client/pom.xml | 2 +- .../{ => dsl}/http-client/settings.gradle | 0 .../java/com/example/loan/Application.java | 0 .../example/loan/LoanApplicationService.java | 0 .../java/com/example/loan/model/Client.java | 0 .../example/loan/model/FraudCheckStatus.java | 0 .../loan/model/FraudServiceRequest.java | 0 .../loan/model/FraudServiceResponse.java | 0 .../example/loan/model/LoanApplication.java | 0 .../loan/model/LoanApplicationResult.java | 0 .../loan/model/LoanApplicationStatus.java | 0 .../src/main/resources/application.yml | 0 .../loan/LoanApplicationServiceTests.java | 0 .../test/resources/application-test-repo.yaml | 0 .../src/test/resources/application.yaml | 0 .../{ => dsl}/http-server/.gitignore | 0 .../{ => dsl}/http-server/.mvn/jvm.config | 0 .../{ => dsl}/http-server/.mvn/maven.config | 0 .../.mvn/wrapper/maven-wrapper.jar | Bin .../.mvn/wrapper/maven-wrapper.properties | 0 .../{ => dsl}/http-server/README.adoc | 0 .../{ => dsl}/http-server/build.gradle | 0 .../{ => dsl}/http-server/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../standalone/{ => dsl}/http-server/gradlew | 0 .../{ => dsl}/http-server/gradlew.bat | 0 samples/standalone/{ => dsl}/http-server/mvnw | 0 .../standalone/{ => dsl}/http-server/mvnw.cmd | 0 .../standalone/{ => dsl}/http-server/pom.xml | 2 +- .../{ => dsl}/http-server/settings.gradle | 0 .../java/com/example/fraud/Application.java | 0 .../fraud/FraudDetectionController.java | 0 .../com/example/fraud/model/FraudCheck.java | 0 .../example/fraud/model/FraudCheckResult.java | 0 .../example/fraud/model/FraudCheckStatus.java | 0 .../src/main/resources/application.yml | 0 .../test/java/com/example/fraud/MvcTest.java | 0 .../contracts/shouldMarkClientAsFraud.groovy | 0 .../shouldMarkClientAsNotFraud.groovy | 0 samples/standalone/dsl/pom.xml | 51 ++++ samples/standalone/pom.xml | 4 +- .../restdocs/http-client/.gitignore | 6 + .../restdocs/http-client/.mvn/jvm.config | 1 + .../restdocs/http-client/.mvn/maven.config | 1 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 49519 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + .../restdocs/http-client/README.adoc | 26 ++ .../restdocs/http-client/build.gradle | 68 +++++ .../restdocs/http-client/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53319 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../standalone/restdocs/http-client/gradlew | 164 ++++++++++++ .../restdocs/http-client/gradlew.bat | 90 +++++++ samples/standalone/restdocs/http-client/mvnw | 234 ++++++++++++++++++ .../standalone/restdocs/http-client/mvnw.cmd | 145 +++++++++++ .../standalone/restdocs/http-client/pom.xml | 155 ++++++++++++ .../restdocs/http-client/settings.gradle | 1 + .../java/com/example/loan/Application.java | 13 + .../example/loan/LoanApplicationService.java | 71 ++++++ .../java/com/example/loan/model/Client.java | 21 ++ .../example/loan/model/FraudCheckStatus.java | 5 + .../loan/model/FraudServiceRequest.java | 34 +++ .../loan/model/FraudServiceResponse.java | 27 ++ .../example/loan/model/LoanApplication.java | 44 ++++ .../loan/model/LoanApplicationResult.java | 32 +++ .../loan/model/LoanApplicationStatus.java | 5 + .../src/main/resources/application.yml | 5 + .../loan/LoanApplicationServiceTests.java | 67 +++++ .../test/resources/application-test-repo.yaml | 3 + .../src/test/resources/application.yaml | 3 + .../restdocs/http-server/.gitignore | 6 + .../restdocs/http-server/.mvn/jvm.config | 1 + .../restdocs/http-server/.mvn/maven.config | 1 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 49519 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + .../restdocs/http-server/README.adoc | 20 ++ .../restdocs/http-server/build.gradle | 74 ++++++ .../restdocs/http-server/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53319 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + .../standalone/restdocs/http-server/gradlew | 164 ++++++++++++ .../restdocs/http-server/gradlew.bat | 90 +++++++ samples/standalone/restdocs/http-server/mvnw | 234 ++++++++++++++++++ .../standalone/restdocs/http-server/mvnw.cmd | 145 +++++++++++ .../standalone/restdocs/http-server/pom.xml | 167 +++++++++++++ .../restdocs/http-server/settings.gradle | 1 + .../http-server/src/assembly/stub.xml | 33 +++ .../java/com/example/fraud/Application.java | 17 ++ .../fraud/FraudDetectionController.java | 45 ++++ .../com/example/fraud/model/FraudCheck.java | 29 +++ .../example/fraud/model/FraudCheckResult.java | 32 +++ .../example/fraud/model/FraudCheckStatus.java | 5 + .../src/main/resources/application.yml | 1 + .../com/example/fraud/StubGeneratorTests.java | 75 ++++++ .../contracts/shouldMarkClientAsFraud.groovy | 31 +++ .../shouldMarkClientAsNotFraud.groovy | 33 +++ samples/standalone/restdocs/pom.xml | 51 ++++ spring-cloud-contract-wiremock/pom.xml | 10 + .../wiremock/ContractRequestHandler.java | 140 +++++++++++ .../WireMockRestDocsConfiguration.java | 42 ++++ .../contract/wiremock/WireMockSnippet.java | 164 ++++++++++++ .../main/resources/META-INF/spring.factories | 6 +- ...iremockServerRestDocsApplicationTests.java | 51 ++++ .../wiremock/WiremockTestsApplication.java | 1 + 119 files changed, 2962 insertions(+), 5 deletions(-) rename samples/standalone/{ => dsl}/http-client/.gitignore (100%) rename samples/standalone/{ => dsl}/http-client/.mvn/jvm.config (100%) rename samples/standalone/{ => dsl}/http-client/.mvn/maven.config (100%) rename samples/standalone/{ => dsl}/http-client/.mvn/wrapper/maven-wrapper.jar (100%) rename samples/standalone/{ => dsl}/http-client/.mvn/wrapper/maven-wrapper.properties (100%) rename samples/standalone/{ => dsl}/http-client/README.adoc (100%) rename samples/standalone/{ => dsl}/http-client/build.gradle (100%) rename samples/standalone/{ => dsl}/http-client/gradle.properties (100%) rename samples/standalone/{ => dsl}/http-client/gradle/wrapper/gradle-wrapper.jar (100%) rename samples/standalone/{ => dsl}/http-client/gradle/wrapper/gradle-wrapper.properties (100%) rename samples/standalone/{ => dsl}/http-client/gradlew (100%) rename samples/standalone/{ => dsl}/http-client/gradlew.bat (100%) rename samples/standalone/{ => dsl}/http-client/mvnw (100%) rename samples/standalone/{ => dsl}/http-client/mvnw.cmd (100%) rename samples/standalone/{ => dsl}/http-client/pom.xml (98%) rename samples/standalone/{ => dsl}/http-client/settings.gradle (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/Application.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/LoanApplicationService.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/model/Client.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/model/LoanApplication.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java (100%) rename samples/standalone/{ => dsl}/http-client/src/main/resources/application.yml (100%) rename samples/standalone/{ => dsl}/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java (100%) rename samples/standalone/{ => dsl}/http-client/src/test/resources/application-test-repo.yaml (100%) rename samples/standalone/{ => dsl}/http-client/src/test/resources/application.yaml (100%) rename samples/standalone/{ => dsl}/http-server/.gitignore (100%) rename samples/standalone/{ => dsl}/http-server/.mvn/jvm.config (100%) rename samples/standalone/{ => dsl}/http-server/.mvn/maven.config (100%) rename samples/standalone/{ => dsl}/http-server/.mvn/wrapper/maven-wrapper.jar (100%) rename samples/standalone/{ => dsl}/http-server/.mvn/wrapper/maven-wrapper.properties (100%) rename samples/standalone/{ => dsl}/http-server/README.adoc (100%) rename samples/standalone/{ => dsl}/http-server/build.gradle (100%) rename samples/standalone/{ => dsl}/http-server/gradle.properties (100%) rename samples/standalone/{ => dsl}/http-server/gradle/wrapper/gradle-wrapper.jar (100%) rename samples/standalone/{ => dsl}/http-server/gradle/wrapper/gradle-wrapper.properties (100%) rename samples/standalone/{ => dsl}/http-server/gradlew (100%) rename samples/standalone/{ => dsl}/http-server/gradlew.bat (100%) rename samples/standalone/{ => dsl}/http-server/mvnw (100%) rename samples/standalone/{ => dsl}/http-server/mvnw.cmd (100%) rename samples/standalone/{ => dsl}/http-server/pom.xml (99%) rename samples/standalone/{ => dsl}/http-server/settings.gradle (100%) rename samples/standalone/{ => dsl}/http-server/src/main/java/com/example/fraud/Application.java (100%) rename samples/standalone/{ => dsl}/http-server/src/main/java/com/example/fraud/FraudDetectionController.java (100%) rename samples/standalone/{ => dsl}/http-server/src/main/java/com/example/fraud/model/FraudCheck.java (100%) rename samples/standalone/{ => dsl}/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java (100%) rename samples/standalone/{ => dsl}/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java (100%) rename samples/standalone/{ => dsl}/http-server/src/main/resources/application.yml (100%) rename samples/standalone/{ => dsl}/http-server/src/test/java/com/example/fraud/MvcTest.java (100%) rename samples/standalone/{ => dsl}/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy (100%) rename samples/standalone/{ => dsl}/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy (100%) create mode 100644 samples/standalone/dsl/pom.xml create mode 100644 samples/standalone/restdocs/http-client/.gitignore create mode 100644 samples/standalone/restdocs/http-client/.mvn/jvm.config create mode 100644 samples/standalone/restdocs/http-client/.mvn/maven.config create mode 100644 samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.jar create mode 100644 samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.properties create mode 100644 samples/standalone/restdocs/http-client/README.adoc create mode 100644 samples/standalone/restdocs/http-client/build.gradle create mode 100644 samples/standalone/restdocs/http-client/gradle.properties create mode 100644 samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.properties create mode 100755 samples/standalone/restdocs/http-client/gradlew create mode 100644 samples/standalone/restdocs/http-client/gradlew.bat create mode 100755 samples/standalone/restdocs/http-client/mvnw create mode 100644 samples/standalone/restdocs/http-client/mvnw.cmd create mode 100644 samples/standalone/restdocs/http-client/pom.xml create mode 100644 samples/standalone/restdocs/http-client/settings.gradle create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/Application.java create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/LoanApplicationService.java create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/Client.java create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplication.java create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java create mode 100644 samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java create mode 100644 samples/standalone/restdocs/http-client/src/main/resources/application.yml create mode 100644 samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java create mode 100644 samples/standalone/restdocs/http-client/src/test/resources/application-test-repo.yaml create mode 100644 samples/standalone/restdocs/http-client/src/test/resources/application.yaml create mode 100644 samples/standalone/restdocs/http-server/.gitignore create mode 100644 samples/standalone/restdocs/http-server/.mvn/jvm.config create mode 100644 samples/standalone/restdocs/http-server/.mvn/maven.config create mode 100644 samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.jar create mode 100644 samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.properties create mode 100644 samples/standalone/restdocs/http-server/README.adoc create mode 100644 samples/standalone/restdocs/http-server/build.gradle create mode 100644 samples/standalone/restdocs/http-server/gradle.properties create mode 100644 samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.jar create mode 100644 samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.properties create mode 100755 samples/standalone/restdocs/http-server/gradlew create mode 100644 samples/standalone/restdocs/http-server/gradlew.bat create mode 100755 samples/standalone/restdocs/http-server/mvnw create mode 100644 samples/standalone/restdocs/http-server/mvnw.cmd create mode 100644 samples/standalone/restdocs/http-server/pom.xml create mode 100644 samples/standalone/restdocs/http-server/settings.gradle create mode 100644 samples/standalone/restdocs/http-server/src/assembly/stub.xml create mode 100644 samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/Application.java create mode 100644 samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/FraudDetectionController.java create mode 100644 samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheck.java create mode 100644 samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java create mode 100644 samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java create mode 100644 samples/standalone/restdocs/http-server/src/main/resources/application.yml create mode 100644 samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java create mode 100644 samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy create mode 100644 samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy create mode 100644 samples/standalone/restdocs/pom.xml create mode 100644 spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/ContractRequestHandler.java create mode 100644 spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestDocsConfiguration.java create mode 100644 spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockSnippet.java create mode 100644 spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java diff --git a/samples/standalone/http-client/.gitignore b/samples/standalone/dsl/http-client/.gitignore similarity index 100% rename from samples/standalone/http-client/.gitignore rename to samples/standalone/dsl/http-client/.gitignore diff --git a/samples/standalone/http-client/.mvn/jvm.config b/samples/standalone/dsl/http-client/.mvn/jvm.config similarity index 100% rename from samples/standalone/http-client/.mvn/jvm.config rename to samples/standalone/dsl/http-client/.mvn/jvm.config diff --git a/samples/standalone/http-client/.mvn/maven.config b/samples/standalone/dsl/http-client/.mvn/maven.config similarity index 100% rename from samples/standalone/http-client/.mvn/maven.config rename to samples/standalone/dsl/http-client/.mvn/maven.config diff --git a/samples/standalone/http-client/.mvn/wrapper/maven-wrapper.jar b/samples/standalone/dsl/http-client/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from samples/standalone/http-client/.mvn/wrapper/maven-wrapper.jar rename to samples/standalone/dsl/http-client/.mvn/wrapper/maven-wrapper.jar diff --git a/samples/standalone/http-client/.mvn/wrapper/maven-wrapper.properties b/samples/standalone/dsl/http-client/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from samples/standalone/http-client/.mvn/wrapper/maven-wrapper.properties rename to samples/standalone/dsl/http-client/.mvn/wrapper/maven-wrapper.properties diff --git a/samples/standalone/http-client/README.adoc b/samples/standalone/dsl/http-client/README.adoc similarity index 100% rename from samples/standalone/http-client/README.adoc rename to samples/standalone/dsl/http-client/README.adoc diff --git a/samples/standalone/http-client/build.gradle b/samples/standalone/dsl/http-client/build.gradle similarity index 100% rename from samples/standalone/http-client/build.gradle rename to samples/standalone/dsl/http-client/build.gradle diff --git a/samples/standalone/http-client/gradle.properties b/samples/standalone/dsl/http-client/gradle.properties similarity index 100% rename from samples/standalone/http-client/gradle.properties rename to samples/standalone/dsl/http-client/gradle.properties diff --git a/samples/standalone/http-client/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from samples/standalone/http-client/gradle/wrapper/gradle-wrapper.jar rename to samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.jar diff --git a/samples/standalone/http-client/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from samples/standalone/http-client/gradle/wrapper/gradle-wrapper.properties rename to samples/standalone/dsl/http-client/gradle/wrapper/gradle-wrapper.properties diff --git a/samples/standalone/http-client/gradlew b/samples/standalone/dsl/http-client/gradlew similarity index 100% rename from samples/standalone/http-client/gradlew rename to samples/standalone/dsl/http-client/gradlew diff --git a/samples/standalone/http-client/gradlew.bat b/samples/standalone/dsl/http-client/gradlew.bat similarity index 100% rename from samples/standalone/http-client/gradlew.bat rename to samples/standalone/dsl/http-client/gradlew.bat diff --git a/samples/standalone/http-client/mvnw b/samples/standalone/dsl/http-client/mvnw similarity index 100% rename from samples/standalone/http-client/mvnw rename to samples/standalone/dsl/http-client/mvnw diff --git a/samples/standalone/http-client/mvnw.cmd b/samples/standalone/dsl/http-client/mvnw.cmd similarity index 100% rename from samples/standalone/http-client/mvnw.cmd rename to samples/standalone/dsl/http-client/mvnw.cmd diff --git a/samples/standalone/http-client/pom.xml b/samples/standalone/dsl/http-client/pom.xml similarity index 98% rename from samples/standalone/http-client/pom.xml rename to samples/standalone/dsl/http-client/pom.xml index 40caed598f..fd4fd25a9e 100644 --- a/samples/standalone/http-client/pom.xml +++ b/samples/standalone/dsl/http-client/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.example - http-client + http-client-dsl 0.0.1-SNAPSHOT Spring Cloud Contract Verifier Http Client Sample diff --git a/samples/standalone/http-client/settings.gradle b/samples/standalone/dsl/http-client/settings.gradle similarity index 100% rename from samples/standalone/http-client/settings.gradle rename to samples/standalone/dsl/http-client/settings.gradle diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/Application.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/Application.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/Application.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/Application.java diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/LoanApplicationService.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/LoanApplicationService.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/Client.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/Client.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/model/Client.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/Client.java diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplication.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplication.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplication.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplication.java diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java diff --git a/samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java similarity index 100% rename from samples/standalone/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java rename to samples/standalone/dsl/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java diff --git a/samples/standalone/http-client/src/main/resources/application.yml b/samples/standalone/dsl/http-client/src/main/resources/application.yml similarity index 100% rename from samples/standalone/http-client/src/main/resources/application.yml rename to samples/standalone/dsl/http-client/src/main/resources/application.yml diff --git a/samples/standalone/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java similarity index 100% rename from samples/standalone/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java rename to samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java diff --git a/samples/standalone/http-client/src/test/resources/application-test-repo.yaml b/samples/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml similarity index 100% rename from samples/standalone/http-client/src/test/resources/application-test-repo.yaml rename to samples/standalone/dsl/http-client/src/test/resources/application-test-repo.yaml diff --git a/samples/standalone/http-client/src/test/resources/application.yaml b/samples/standalone/dsl/http-client/src/test/resources/application.yaml similarity index 100% rename from samples/standalone/http-client/src/test/resources/application.yaml rename to samples/standalone/dsl/http-client/src/test/resources/application.yaml diff --git a/samples/standalone/http-server/.gitignore b/samples/standalone/dsl/http-server/.gitignore similarity index 100% rename from samples/standalone/http-server/.gitignore rename to samples/standalone/dsl/http-server/.gitignore diff --git a/samples/standalone/http-server/.mvn/jvm.config b/samples/standalone/dsl/http-server/.mvn/jvm.config similarity index 100% rename from samples/standalone/http-server/.mvn/jvm.config rename to samples/standalone/dsl/http-server/.mvn/jvm.config diff --git a/samples/standalone/http-server/.mvn/maven.config b/samples/standalone/dsl/http-server/.mvn/maven.config similarity index 100% rename from samples/standalone/http-server/.mvn/maven.config rename to samples/standalone/dsl/http-server/.mvn/maven.config diff --git a/samples/standalone/http-server/.mvn/wrapper/maven-wrapper.jar b/samples/standalone/dsl/http-server/.mvn/wrapper/maven-wrapper.jar similarity index 100% rename from samples/standalone/http-server/.mvn/wrapper/maven-wrapper.jar rename to samples/standalone/dsl/http-server/.mvn/wrapper/maven-wrapper.jar diff --git a/samples/standalone/http-server/.mvn/wrapper/maven-wrapper.properties b/samples/standalone/dsl/http-server/.mvn/wrapper/maven-wrapper.properties similarity index 100% rename from samples/standalone/http-server/.mvn/wrapper/maven-wrapper.properties rename to samples/standalone/dsl/http-server/.mvn/wrapper/maven-wrapper.properties diff --git a/samples/standalone/http-server/README.adoc b/samples/standalone/dsl/http-server/README.adoc similarity index 100% rename from samples/standalone/http-server/README.adoc rename to samples/standalone/dsl/http-server/README.adoc diff --git a/samples/standalone/http-server/build.gradle b/samples/standalone/dsl/http-server/build.gradle similarity index 100% rename from samples/standalone/http-server/build.gradle rename to samples/standalone/dsl/http-server/build.gradle diff --git a/samples/standalone/http-server/gradle.properties b/samples/standalone/dsl/http-server/gradle.properties similarity index 100% rename from samples/standalone/http-server/gradle.properties rename to samples/standalone/dsl/http-server/gradle.properties diff --git a/samples/standalone/http-server/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from samples/standalone/http-server/gradle/wrapper/gradle-wrapper.jar rename to samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.jar diff --git a/samples/standalone/http-server/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from samples/standalone/http-server/gradle/wrapper/gradle-wrapper.properties rename to samples/standalone/dsl/http-server/gradle/wrapper/gradle-wrapper.properties diff --git a/samples/standalone/http-server/gradlew b/samples/standalone/dsl/http-server/gradlew similarity index 100% rename from samples/standalone/http-server/gradlew rename to samples/standalone/dsl/http-server/gradlew diff --git a/samples/standalone/http-server/gradlew.bat b/samples/standalone/dsl/http-server/gradlew.bat similarity index 100% rename from samples/standalone/http-server/gradlew.bat rename to samples/standalone/dsl/http-server/gradlew.bat diff --git a/samples/standalone/http-server/mvnw b/samples/standalone/dsl/http-server/mvnw similarity index 100% rename from samples/standalone/http-server/mvnw rename to samples/standalone/dsl/http-server/mvnw diff --git a/samples/standalone/http-server/mvnw.cmd b/samples/standalone/dsl/http-server/mvnw.cmd similarity index 100% rename from samples/standalone/http-server/mvnw.cmd rename to samples/standalone/dsl/http-server/mvnw.cmd diff --git a/samples/standalone/http-server/pom.xml b/samples/standalone/dsl/http-server/pom.xml similarity index 99% rename from samples/standalone/http-server/pom.xml rename to samples/standalone/dsl/http-server/pom.xml index 80bdb58cd8..76dc7f43fa 100644 --- a/samples/standalone/http-server/pom.xml +++ b/samples/standalone/dsl/http-server/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.example - http-server + http-server-dsl 0.0.1-SNAPSHOT Spring Cloud Contract Verifier Http Server Sample diff --git a/samples/standalone/http-server/settings.gradle b/samples/standalone/dsl/http-server/settings.gradle similarity index 100% rename from samples/standalone/http-server/settings.gradle rename to samples/standalone/dsl/http-server/settings.gradle diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/Application.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/Application.java similarity index 100% rename from samples/standalone/http-server/src/main/java/com/example/fraud/Application.java rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/Application.java diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/FraudDetectionController.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java similarity index 100% rename from samples/standalone/http-server/src/main/java/com/example/fraud/FraudDetectionController.java rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudDetectionController.java diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheck.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheck.java similarity index 100% rename from samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheck.java rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheck.java diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java similarity index 100% rename from samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java diff --git a/samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java similarity index 100% rename from samples/standalone/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java rename to samples/standalone/dsl/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java diff --git a/samples/standalone/http-server/src/main/resources/application.yml b/samples/standalone/dsl/http-server/src/main/resources/application.yml similarity index 100% rename from samples/standalone/http-server/src/main/resources/application.yml rename to samples/standalone/dsl/http-server/src/main/resources/application.yml diff --git a/samples/standalone/http-server/src/test/java/com/example/fraud/MvcTest.java b/samples/standalone/dsl/http-server/src/test/java/com/example/fraud/MvcTest.java similarity index 100% rename from samples/standalone/http-server/src/test/java/com/example/fraud/MvcTest.java rename to samples/standalone/dsl/http-server/src/test/java/com/example/fraud/MvcTest.java diff --git a/samples/standalone/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy b/samples/standalone/dsl/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy similarity index 100% rename from samples/standalone/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy rename to samples/standalone/dsl/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy diff --git a/samples/standalone/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy b/samples/standalone/dsl/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy similarity index 100% rename from samples/standalone/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy rename to samples/standalone/dsl/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy diff --git a/samples/standalone/dsl/pom.xml b/samples/standalone/dsl/pom.xml new file mode 100644 index 0000000000..345fdd2052 --- /dev/null +++ b/samples/standalone/dsl/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + + org.springframework.cloud + spring-cloud-contract-samples-standalone + 1.0.0.BUILD-SNAPSHOT + .. + + + spring-cloud-contract-samples-dsl + pom + + Spring Cloud Contract Standalone Test Samples + Spring Cloud Contract Standalone Test Samples used for end to end tests + + + http-server + http-client + + + + + + maven-deploy-plugin + + true + + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.5 + + + + testCompile + + + + + + + + + diff --git a/samples/standalone/pom.xml b/samples/standalone/pom.xml index 98e33aa48c..25389e6d61 100644 --- a/samples/standalone/pom.xml +++ b/samples/standalone/pom.xml @@ -17,8 +17,8 @@ Spring Cloud Contract Standalone Test Samples used for end to end tests - http-server - http-client + dsl + restdocs stream-source stream-sink diff --git a/samples/standalone/restdocs/http-client/.gitignore b/samples/standalone/restdocs/http-client/.gitignore new file mode 100644 index 0000000000..b05ba7bd6d --- /dev/null +++ b/samples/standalone/restdocs/http-client/.gitignore @@ -0,0 +1,6 @@ + +target/ + +.gradle +build/ + diff --git a/samples/standalone/restdocs/http-client/.mvn/jvm.config b/samples/standalone/restdocs/http-client/.mvn/jvm.config new file mode 100644 index 0000000000..894bef17a5 --- /dev/null +++ b/samples/standalone/restdocs/http-client/.mvn/jvm.config @@ -0,0 +1 @@ +-Xmx1024m -XX:MaxPermSize=256m -Djava.awt.headless=true \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/.mvn/maven.config b/samples/standalone/restdocs/http-client/.mvn/maven.config new file mode 100644 index 0000000000..affad39a42 --- /dev/null +++ b/samples/standalone/restdocs/http-client/.mvn/maven.config @@ -0,0 +1 @@ +-T2 \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.jar b/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c6feb8bb6f76f2553e266ff8bf8867105154237e GIT binary patch literal 49519 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%0A$pwhjXzyA0ZzErH{1@M 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 literal 0 HcmV?d00001 diff --git a/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.properties b/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..6637cedb28 --- /dev/null +++ b/samples/standalone/restdocs/http-client/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/README.adoc b/samples/standalone/restdocs/http-client/README.adoc new file mode 100644 index 0000000000..cdcb0e4a56 --- /dev/null +++ b/samples/standalone/restdocs/http-client/README.adoc @@ -0,0 +1,26 @@ += Http Client + +== Prerequisites + +First you have to publish to Maven Local the stubs of the *http-server* module + +== How to run it? + +Run + +[source=groovy] +-------- +./gradlew clean build +-------- + +or + +-------- +./mvnw clean package +-------- + +To + +- build the app +- use spring-cloud-contract-stub-runner-spring[Stub Runner Spring] to download the stub of `Http Server` +- run the tests against stubbed server \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/build.gradle b/samples/standalone/restdocs/http-client/build.gradle new file mode 100644 index 0000000000..4db1443b15 --- /dev/null +++ b/samples/standalone/restdocs/http-client/build.gradle @@ -0,0 +1,68 @@ +buildscript { + repositories { + mavenCentral() + mavenLocal() + maven { url "http://repo.spring.io/libs-snapshot-local" } + maven { url "http://repo.spring.io/libs-release-local" } + maven { url "http://repo.spring.io/libs-staging-local" } + maven { url 'http://repo.spring.io/plugins-snapshot' } + maven { url "http://repo.spring.io/plugins-release-local" } + maven { url "http://repo.spring.io/plugins-staging-local/" } + } + dependencies { + classpath "org.springframework.boot:spring-boot-gradle-plugin:1.4.0.BUILD-SNAPSHOT" + } +} + +group = 'com.example' +version = '0.0.1-SNAPSHOT' + +repositories { + mavenCentral() + mavenLocal() + maven { url "http://repo.spring.io/libs-release-local" } + maven { url "http://repo.spring.io/libs-snapshot-local/" } + maven { url "http://repo.spring.io/libs-milestone-local/" } +} + +apply plugin: 'groovy' +apply plugin: 'spring-boot' +apply plugin: 'maven-publish' + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:$BOM_VERSION" + mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${project.findProperty('verifierVersion') ?: verifierVersion}" + } +} + +dependencies { + compile("org.springframework.boot:spring-boot-starter-web") + compile("org.springframework.boot:spring-boot-starter-actuator") + + testCompile 'org.springframework.cloud:spring-cloud-contract-wiremock' + testCompile "org.springframework.cloud:spring-cloud-starter-contract-stub-runner" +} + +test { + testLogging { + exceptionFormat = 'full' + } +} + +task wrapper(type: Wrapper) { + gradleVersion = '2.14' +} + +task resolveDependencies { + doLast { + project.rootProject.allprojects.each { subProject -> + subProject.buildscript.configurations.each { configuration -> + configuration.resolve() + } + subProject.configurations.each { configuration -> + configuration.resolve() + } + } + } +} diff --git a/samples/standalone/restdocs/http-client/gradle.properties b/samples/standalone/restdocs/http-client/gradle.properties new file mode 100644 index 0000000000..004e3e550a --- /dev/null +++ b/samples/standalone/restdocs/http-client/gradle.properties @@ -0,0 +1,2 @@ +verifierVersion=1.0.0.BUILD-SNAPSHOT +BOM_VERSION=Brixton.SR3 \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d3b83982b9b1bccad955349d702be9b884c6e049 GIT binary patch literal 53319 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 literal 0 HcmV?d00001 diff --git a/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..fe18faa66a --- /dev/null +++ b/samples/standalone/restdocs/http-client/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Jul 21 10:16:50 CEST 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip diff --git a/samples/standalone/restdocs/http-client/gradlew b/samples/standalone/restdocs/http-client/gradlew new file mode 100755 index 0000000000..27309d9231 --- /dev/null +++ b/samples/standalone/restdocs/http-client/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/samples/standalone/restdocs/http-client/gradlew.bat b/samples/standalone/restdocs/http-client/gradlew.bat new file mode 100644 index 0000000000..832fdb6079 --- /dev/null +++ b/samples/standalone/restdocs/http-client/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/standalone/restdocs/http-client/mvnw b/samples/standalone/restdocs/http-client/mvnw new file mode 100755 index 0000000000..fc7efd17d0 --- /dev/null +++ b/samples/standalone/restdocs/http-client/mvnw @@ -0,0 +1,234 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CMD_LINE_ARGS + diff --git a/samples/standalone/restdocs/http-client/mvnw.cmd b/samples/standalone/restdocs/http-client/mvnw.cmd new file mode 100644 index 0000000000..001048081d --- /dev/null +++ b/samples/standalone/restdocs/http-client/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/samples/standalone/restdocs/http-client/pom.xml b/samples/standalone/restdocs/http-client/pom.xml new file mode 100644 index 0000000000..87df44efca --- /dev/null +++ b/samples/standalone/restdocs/http-client/pom.xml @@ -0,0 +1,155 @@ + + + 4.0.0 + + com.example + http-client-restdocs + 0.0.1-SNAPSHOT + + Spring Cloud Contract Verifier Http Client Sample + Spring Cloud Contract Verifier Http Client Sample + + + org.springframework.boot + spring-boot-starter-parent + 1.4.0.BUILD-SNAPSHOT + + + + + UTF-8 + 1.8 + 1.0.0.BUILD-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.cloud + spring-cloud-contract-wiremock + test + + + com.example + http-server-restdocs + stubs + 0.0.1-SNAPSHOT + test + + + + + + + + + org.springframework.cloud + spring-cloud-contract-dependencies + ${spring-cloud-contract.version} + pom + import + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + maven-deploy-plugin + + true + + + + + + + + spring + + true + + + + spring-snapshots + Spring Snapshots + http://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + http://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + http://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + http://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + http://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + http://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + http://repo.spring.io/plugins-milestone-local + + false + + + + + + + diff --git a/samples/standalone/restdocs/http-client/settings.gradle b/samples/standalone/restdocs/http-client/settings.gradle new file mode 100644 index 0000000000..8dc58d5ad1 --- /dev/null +++ b/samples/standalone/restdocs/http-client/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'http-client' diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/Application.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/Application.java new file mode 100644 index 0000000000..6f36301172 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/Application.java @@ -0,0 +1,13 @@ +package com.example.loan; + +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/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/LoanApplicationService.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/LoanApplicationService.java new file mode 100644 index 0000000000..33cd026aac --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/LoanApplicationService.java @@ -0,0 +1,71 @@ +package com.example.loan; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import com.example.loan.model.FraudCheckStatus; +import com.example.loan.model.FraudServiceRequest; +import com.example.loan.model.FraudServiceResponse; +import com.example.loan.model.LoanApplication; +import com.example.loan.model.LoanApplicationResult; +import com.example.loan.model.LoanApplicationStatus; + +@Service +public class LoanApplicationService { + + private static final String FRAUD_SERVICE_JSON_VERSION_1 = + "application/vnd.fraud.v1+json"; + + private final RestTemplate restTemplate; + + private int port = 8080; + + public LoanApplicationService() { + this.restTemplate = new RestTemplate(); + } + + public LoanApplicationResult loanApplication(LoanApplication loanApplication) { + FraudServiceRequest request = + new FraudServiceRequest(loanApplication); + + FraudServiceResponse response = + sendRequestToFraudDetectionService(request); + + return buildResponseFromFraudResult(response); + } + + private FraudServiceResponse sendRequestToFraudDetectionService( + FraudServiceRequest request) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_TYPE, FRAUD_SERVICE_JSON_VERSION_1); + + // tag::client_call_server[] + ResponseEntity response = + restTemplate.exchange("http://localhost:" + port + "/fraudcheck", HttpMethod.PUT, + new HttpEntity<>(request, httpHeaders), + FraudServiceResponse.class); + // end::client_call_server[] + + return response.getBody(); + } + + private LoanApplicationResult buildResponseFromFraudResult(FraudServiceResponse response) { + LoanApplicationStatus applicationStatus = null; + if (FraudCheckStatus.OK == response.getFraudCheckStatus()) { + applicationStatus = LoanApplicationStatus.LOAN_APPLIED; + } else if (FraudCheckStatus.FRAUD == response.getFraudCheckStatus()) { + applicationStatus = LoanApplicationStatus.LOAN_APPLICATION_REJECTED; + } + + return new LoanApplicationResult(applicationStatus, response.getRejectionReason()); + } + + public void setPort(int port) { + this.port = port; + } + +} diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/Client.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/Client.java new file mode 100644 index 0000000000..abf66106b5 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/Client.java @@ -0,0 +1,21 @@ +package com.example.loan.model; + +public class Client { + + private String pesel; + + public Client() { + } + + public Client(String pesel) { + this.pesel = pesel; + } + + public String getPesel() { + return pesel; + } + + public void setPesel(String pesel) { + this.pesel = pesel; + } +} diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java new file mode 100644 index 0000000000..c5217ef471 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudCheckStatus.java @@ -0,0 +1,5 @@ +package com.example.loan.model; + +public enum FraudCheckStatus { + OK, FRAUD +} diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java new file mode 100644 index 0000000000..0230540131 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceRequest.java @@ -0,0 +1,34 @@ +package com.example.loan.model; + +import java.math.BigDecimal; + +public class FraudServiceRequest { + + private String clientId; + + private BigDecimal loanAmount; + + public FraudServiceRequest() { + } + + public FraudServiceRequest(LoanApplication loanApplication) { + this.clientId = loanApplication.getClient().getPesel(); + this.loanAmount = loanApplication.getAmount(); + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public BigDecimal getLoanAmount() { + return loanAmount; + } + + public void setLoanAmount(BigDecimal loanAmount) { + this.loanAmount = loanAmount; + } +} diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java new file mode 100644 index 0000000000..50e64478b9 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/FraudServiceResponse.java @@ -0,0 +1,27 @@ +package com.example.loan.model; + +public class FraudServiceResponse { + + private FraudCheckStatus fraudCheckStatus; + + private String rejectionReason; + + public FraudServiceResponse() { + } + + 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/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplication.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplication.java new file mode 100644 index 0000000000..27d66f884c --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplication.java @@ -0,0 +1,44 @@ +package com.example.loan.model; + +import java.math.BigDecimal; + +public class LoanApplication { + + private Client client; + + private BigDecimal amount; + + private String loanApplicationId; + + public LoanApplication() { + } + + public LoanApplication(Client client, double amount) { + this.client = client; + this.amount = BigDecimal.valueOf(amount); + } + + public Client getClient() { + return client; + } + + public void setClient(Client client) { + this.client = client; + } + + public BigDecimal getAmount() { + return amount; + } + + public void setAmount(BigDecimal amount) { + this.amount = amount; + } + + public String getLoanApplicationId() { + return loanApplicationId; + } + + public void setLoanApplicationId(String loanApplicationId) { + this.loanApplicationId = loanApplicationId; + } +} diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java new file mode 100644 index 0000000000..ffd44e1a26 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationResult.java @@ -0,0 +1,32 @@ +package com.example.loan.model; + +public class LoanApplicationResult { + + private LoanApplicationStatus loanApplicationStatus; + + private String rejectionReason; + + public LoanApplicationResult() { + } + + public LoanApplicationResult(LoanApplicationStatus loanApplicationStatus, String rejectionReason) { + this.loanApplicationStatus = loanApplicationStatus; + this.rejectionReason = rejectionReason; + } + + public LoanApplicationStatus getLoanApplicationStatus() { + return loanApplicationStatus; + } + + public void setLoanApplicationStatus(LoanApplicationStatus loanApplicationStatus) { + this.loanApplicationStatus = loanApplicationStatus; + } + + public String getRejectionReason() { + return rejectionReason; + } + + public void setRejectionReason(String rejectionReason) { + this.rejectionReason = rejectionReason; + } +} diff --git a/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java new file mode 100644 index 0000000000..34cf91a89f --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/java/com/example/loan/model/LoanApplicationStatus.java @@ -0,0 +1,5 @@ +package com.example.loan.model; + +public enum LoanApplicationStatus { + LOAN_APPLIED, LOAN_APPLICATION_REJECTED +} diff --git a/samples/standalone/restdocs/http-client/src/main/resources/application.yml b/samples/standalone/restdocs/http-client/src/main/resources/application.yml new file mode 100644 index 0000000000..0cde20a49d --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/main/resources/application.yml @@ -0,0 +1,5 @@ +server.port: 8090 +logging: + level: + org.springframework.web.client: debug + com.github.tomakehurst.wiremock: trace \ No newline at end of file diff --git a/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java new file mode 100644 index 0000000000..f7f02a2ab6 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -0,0 +1,67 @@ +package com.example.loan; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.cloud.contract.wiremock.AutoConfigureWireMock; +import org.springframework.cloud.contract.wiremock.WireMockSpring; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.junit4.SpringRunner; + +import com.example.loan.model.Client; +import com.example.loan.model.LoanApplication; +import com.example.loan.model.LoanApplicationResult; +import com.example.loan.model.LoanApplicationStatus; +import com.github.tomakehurst.wiremock.core.Options; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes=TestConfiguration.class) +@AutoConfigureWireMock +public class LoanApplicationServiceTests { + + @Autowired + private LoanApplicationService sut; + + @Test + public void shouldSuccessfullyApplyForLoan() { + // given: + LoanApplication application = new LoanApplication(new Client("1234567890"), + 123.123); + // when: + LoanApplicationResult loanApplication = sut.loanApplication(application); + // then: + assertThat(loanApplication.getLoanApplicationStatus()) + .isEqualTo(LoanApplicationStatus.LOAN_APPLIED); + assertThat(loanApplication.getRejectionReason()).isNull(); + } + + @Test + public void shouldBeRejectedDueToAbnormalLoanAmount() { + // given: + LoanApplication application = new LoanApplication(new Client("1234567890"), + 99999); + // when: + LoanApplicationResult loanApplication = sut.loanApplication(application); + // then: + assertThat(loanApplication.getLoanApplicationStatus()) + .isEqualTo(LoanApplicationStatus.LOAN_APPLICATION_REJECTED); + assertThat(loanApplication.getRejectionReason()).isEqualTo("Amount too high"); + } + + @Configuration + @Import(Application.class) + protected static class TestConfiguration { + + @Bean + public Options wiremockOptions() { + return WireMockSpring.options().usingFilesUnderClasspath("META-INF/wiremock"); + } + + } +} diff --git a/samples/standalone/restdocs/http-client/src/test/resources/application-test-repo.yaml b/samples/standalone/restdocs/http-client/src/test/resources/application-test-repo.yaml new file mode 100644 index 0000000000..2ac488ce08 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/test/resources/application-test-repo.yaml @@ -0,0 +1,3 @@ +stubrunner.stubs: + ids: 'com.example:http-server:+:stubs:8080' + repositoryRoot: http://repo.spring.io/libs-snapshot diff --git a/samples/standalone/restdocs/http-client/src/test/resources/application.yaml b/samples/standalone/restdocs/http-client/src/test/resources/application.yaml new file mode 100644 index 0000000000..b260e2bac4 --- /dev/null +++ b/samples/standalone/restdocs/http-client/src/test/resources/application.yaml @@ -0,0 +1,3 @@ +stubrunner: + work-offline: true + stubs.ids: 'com.example:http-server:+:stubs:8080' \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/.gitignore b/samples/standalone/restdocs/http-server/.gitignore new file mode 100644 index 0000000000..b05ba7bd6d --- /dev/null +++ b/samples/standalone/restdocs/http-server/.gitignore @@ -0,0 +1,6 @@ + +target/ + +.gradle +build/ + diff --git a/samples/standalone/restdocs/http-server/.mvn/jvm.config b/samples/standalone/restdocs/http-server/.mvn/jvm.config new file mode 100644 index 0000000000..894bef17a5 --- /dev/null +++ b/samples/standalone/restdocs/http-server/.mvn/jvm.config @@ -0,0 +1 @@ +-Xmx1024m -XX:MaxPermSize=256m -Djava.awt.headless=true \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/.mvn/maven.config b/samples/standalone/restdocs/http-server/.mvn/maven.config new file mode 100644 index 0000000000..7681bc67b9 --- /dev/null +++ b/samples/standalone/restdocs/http-server/.mvn/maven.config @@ -0,0 +1 @@ +-T2 diff --git a/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.jar b/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c6feb8bb6f76f2553e266ff8bf8867105154237e GIT binary patch literal 49519 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%0A$pwhjXzyA0ZzErH{1@M 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 literal 0 HcmV?d00001 diff --git a/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.properties b/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..6637cedb28 --- /dev/null +++ b/samples/standalone/restdocs/http-server/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/README.adoc b/samples/standalone/restdocs/http-server/README.adoc new file mode 100644 index 0000000000..2fd3fbc40d --- /dev/null +++ b/samples/standalone/restdocs/http-server/README.adoc @@ -0,0 +1,20 @@ += Http Server + +Run + +[source=groovy] +-------- +./gradlew clean build publishToMavenLocal +-------- + +or + +-------- +./mvnw clean install +-------- + +To + +- build the app +- generate and run Spring Cloud Contract Verifier tests +- publish the fatJar and the stubs to Maven Local \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/build.gradle b/samples/standalone/restdocs/http-server/build.gradle new file mode 100644 index 0000000000..6279c4264c --- /dev/null +++ b/samples/standalone/restdocs/http-server/build.gradle @@ -0,0 +1,74 @@ +buildscript { + repositories { + mavenCentral() + mavenLocal() + maven { url "http://repo.spring.io/libs-snapshot-local" } + maven { url "http://repo.spring.io/libs-release-local" } + maven { url "http://repo.spring.io/libs-staging-local/" } + maven { url 'http://repo.spring.io/plugins-snapshot' } + maven { url "http://repo.spring.io/plugins-release-local" } + maven { url "http://repo.spring.io/plugins-staging-local/" } + } + dependencies { + classpath "org.springframework.boot:spring-boot-gradle-plugin:1.4.0.BUILD-SNAPSHOT" + classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${findProperty('verifierVersion') ?: verifierVersion}" + } +} + +group = 'com.example' +version = '0.0.1-SNAPSHOT' + +repositories { + mavenCentral() + mavenLocal() + maven { url "http://repo.spring.io/snapshot" } + maven { url "http://repo.spring.io/milestone" } + maven { url "http://repo.spring.io/libs-release-local" } + maven { url "http://repo.spring.io/libs-staging-local/" } +} + +apply plugin: 'groovy' +apply plugin: 'spring-boot' +apply plugin: 'spring-cloud-contract' +apply plugin: 'maven-publish' + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:$BOM_VERSION" + mavenBom "org.springframework.cloud:spring-cloud-contract-dependencies:${project.findProperty('verifierVersion') ?: verifierVersion}" + } +} + +contracts { + baseClassForTests = 'com.example.fraud.MvcTest' +} + +dependencies { + compile("org.springframework.boot:spring-boot-starter-web") + compile("org.springframework.boot:spring-boot-starter-actuator") + + testCompile 'org.springframework.cloud:spring-cloud-starter-contract-verifier' +} + +test { + testLogging { + exceptionFormat = 'full' + } +} + +task wrapper(type: Wrapper) { + gradleVersion = '2.14' +} + +task resolveDependencies { + doLast { + project.rootProject.allprojects.each { subProject -> + subProject.buildscript.configurations.each { configuration -> + configuration.resolve() + } + subProject.configurations.each { configuration -> + configuration.resolve() + } + } + } +} diff --git a/samples/standalone/restdocs/http-server/gradle.properties b/samples/standalone/restdocs/http-server/gradle.properties new file mode 100644 index 0000000000..004e3e550a --- /dev/null +++ b/samples/standalone/restdocs/http-server/gradle.properties @@ -0,0 +1,2 @@ +verifierVersion=1.0.0.BUILD-SNAPSHOT +BOM_VERSION=Brixton.SR3 \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.jar b/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d3b83982b9b1bccad955349d702be9b884c6e049 GIT binary patch literal 53319 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 literal 0 HcmV?d00001 diff --git a/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.properties b/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..fe18faa66a --- /dev/null +++ b/samples/standalone/restdocs/http-server/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Jul 21 10:16:50 CEST 2016 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip diff --git a/samples/standalone/restdocs/http-server/gradlew b/samples/standalone/restdocs/http-server/gradlew new file mode 100755 index 0000000000..27309d9231 --- /dev/null +++ b/samples/standalone/restdocs/http-server/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/samples/standalone/restdocs/http-server/gradlew.bat b/samples/standalone/restdocs/http-server/gradlew.bat new file mode 100644 index 0000000000..832fdb6079 --- /dev/null +++ b/samples/standalone/restdocs/http-server/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/standalone/restdocs/http-server/mvnw b/samples/standalone/restdocs/http-server/mvnw new file mode 100755 index 0000000000..fc7efd17d0 --- /dev/null +++ b/samples/standalone/restdocs/http-server/mvnw @@ -0,0 +1,234 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi + + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=`/usr/libexec/java_home` + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Migwn, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + local basedir=$(pwd) + local wdir=$(pwd) + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + wdir=$(cd "$wdir/.."; pwd) + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CMD_LINE_ARGS + diff --git a/samples/standalone/restdocs/http-server/mvnw.cmd b/samples/standalone/restdocs/http-server/mvnw.cmd new file mode 100644 index 0000000000..001048081d --- /dev/null +++ b/samples/standalone/restdocs/http-server/mvnw.cmd @@ -0,0 +1,145 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +set MAVEN_CMD_LINE_ARGS=%MAVEN_CONFIG% %* + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" + +set WRAPPER_JAR=""%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/samples/standalone/restdocs/http-server/pom.xml b/samples/standalone/restdocs/http-server/pom.xml new file mode 100644 index 0000000000..82310d4839 --- /dev/null +++ b/samples/standalone/restdocs/http-server/pom.xml @@ -0,0 +1,167 @@ + + + 4.0.0 + + com.example + http-server-restdocs + 0.0.1-SNAPSHOT + + Spring Cloud Contract Verifier Http Server Sample + Spring Cloud Contract Verifier Http Server Sample + + + org.springframework.boot + spring-boot-starter-parent + 1.4.0.BUILD-SNAPSHOT + + + + + UTF-8 + 1.8 + 1.0.0.BUILD-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.restdocs + spring-restdocs-mockmvc + true + + + org.springframework.cloud + spring-cloud-contract-wiremock + test + + + + + + + org.springframework.cloud + spring-cloud-contract-dependencies + ${spring-cloud-contract.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + maven-deploy-plugin + + true + + + + org.apache.maven.plugins + maven-assembly-plugin + + + stub + prepare-package + + single + + false + + true + ${basedir}/src/assembly/stub.xml + + + + + + + + + + spring + + true + + + + spring-snapshots + Spring Snapshots + http://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + http://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + http://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + http://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + http://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + http://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + http://repo.spring.io/plugins-milestone-local + + false + + + + + + diff --git a/samples/standalone/restdocs/http-server/settings.gradle b/samples/standalone/restdocs/http-server/settings.gradle new file mode 100644 index 0000000000..b4f382e60c --- /dev/null +++ b/samples/standalone/restdocs/http-server/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'http-server' diff --git a/samples/standalone/restdocs/http-server/src/assembly/stub.xml b/samples/standalone/restdocs/http-server/src/assembly/stub.xml new file mode 100644 index 0000000000..235d026263 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/assembly/stub.xml @@ -0,0 +1,33 @@ + + stubs + + jar + + false + + + src/main/java + / + + **/model/Fraud*.* + + + + ${project.build.directory}/classes + / + + **/model/Fraud*.* + + + + ${project.build.directory}/snippets/stubs + META-INF/wiremock/mappings/${project.artifactId} + + **/* + + + + \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/Application.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/Application.java new file mode 100644 index 0000000000..9117009b09 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/Application.java @@ -0,0 +1,17 @@ +package com.example.fraud; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableAutoConfiguration +@ComponentScan +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/FraudDetectionController.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/FraudDetectionController.java new file mode 100644 index 0000000000..82ae6bee85 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/FraudDetectionController.java @@ -0,0 +1,45 @@ +package com.example.fraud; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.fraud.model.FraudCheck; +import com.example.fraud.model.FraudCheckResult; +import com.example.fraud.model.FraudCheckStatus; + +import java.math.BigDecimal; + +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"); + + // tag::server_api[] + @RequestMapping( + value = "/fraudcheck", + method = PUT, + consumes = FRAUD_SERVICE_JSON_VERSION_1, + produces = FRAUD_SERVICE_JSON_VERSION_1) + public FraudCheckResult fraudCheck(@RequestBody FraudCheck fraudCheck) { + // end::server_api[] + // tag::new_impl[] + if (amountGreaterThanThreshold(fraudCheck)) { + return new FraudCheckResult(FraudCheckStatus.FRAUD, AMOUNT_TOO_HIGH); + } + // end::new_impl[] + // tag::initial_impl[] + return new FraudCheckResult(FraudCheckStatus.OK, NO_REASON); + // end::initial_impl[] + } + + private boolean amountGreaterThanThreshold(FraudCheck fraudCheck) { + return MAX_AMOUNT.compareTo(fraudCheck.getLoanAmount()) < 0; + } + +} diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheck.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheck.java new file mode 100644 index 0000000000..b0210573e2 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheck.java @@ -0,0 +1,29 @@ +package com.example.fraud.model; + +import java.math.BigDecimal; + +public class FraudCheck { + + private String clientId; + + private BigDecimal loanAmount; + + public FraudCheck() { + } + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public BigDecimal getLoanAmount() { + return loanAmount; + } + + public void setLoanAmount(BigDecimal loanAmount) { + this.loanAmount = loanAmount; + } +} diff --git a/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java new file mode 100644 index 0000000000..60b340276a --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckResult.java @@ -0,0 +1,32 @@ +package com.example.fraud.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/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java new file mode 100644 index 0000000000..5a6adcf274 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/main/java/com/example/fraud/model/FraudCheckStatus.java @@ -0,0 +1,5 @@ +package com.example.fraud.model; + +public enum FraudCheckStatus { + OK, FRAUD +} diff --git a/samples/standalone/restdocs/http-server/src/main/resources/application.yml b/samples/standalone/restdocs/http-server/src/main/resources/application.yml new file mode 100644 index 0000000000..a30a91f034 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/main/resources/application.yml @@ -0,0 +1 @@ +server.port=8085 \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java new file mode 100644 index 0000000000..b295520f94 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/test/java/com/example/fraud/StubGeneratorTests.java @@ -0,0 +1,75 @@ +package com.example.fraud; + +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; + +import java.math.BigDecimal; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.cloud.contract.wiremock.WireMockSnippet; +import org.springframework.http.MediaType; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import com.example.fraud.model.FraudCheck; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +@AutoConfigureRestDocs(outputDir = "target/snippets") +@AutoConfigureMockMvc +@AutoConfigureJsonTesters +@DirtiesContext +public class StubGeneratorTests { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private WireMockSnippet snippet; + + private JacksonTester json; + + @Test + public void shouldMarkClientAsFraud() throws Exception { + FraudCheck fraudCheck = new FraudCheck(); + fraudCheck.setClientId("1234567890"); + fraudCheck.setLoanAmount(BigDecimal.valueOf(99999.0)); + mockMvc.perform(MockMvcRequestBuilders.put("/fraudcheck") + .contentType(MediaType.valueOf("application/vnd.fraud.v1+json")) + .content(json.write(fraudCheck).getJson())) + .andExpect(MockMvcResultMatchers.jsonPath("$.fraudCheckStatus") + .value("FRAUD")) + .andExpect(MockMvcResultMatchers.jsonPath("$.rejectionReason") + .value("Amount too high")) + .andDo(snippet.content().jsonPath("$.clientId").jsonPath("$[?(@.loanAmount > 1000)]") + .contentType(MediaType.valueOf("application/vnd.fraud.v1+json"))) + .andDo(document("markClientAsFraud")); + } + + @Test + public void shouldMarkClientAsNotFraud() throws Exception { + FraudCheck fraudCheck = new FraudCheck(); + fraudCheck.setClientId("1234567890"); + fraudCheck.setLoanAmount(BigDecimal.valueOf(1)); + mockMvc.perform(MockMvcRequestBuilders.put("/fraudcheck") + .contentType(MediaType.valueOf("application/vnd.fraud.v1+json")) + .content(json.write(fraudCheck).getJson())) + .andExpect(MockMvcResultMatchers.jsonPath("$.fraudCheckStatus") + .value("OK")) + .andExpect(MockMvcResultMatchers.jsonPath("$.rejectionReason") + .doesNotExist()) + .andDo(snippet.content().jsonPath("$.clientId").jsonPath("$[?(@.loanAmount <= 1000)]") + .contentType(MediaType.valueOf("application/vnd.fraud.v1+json"))) + .andDo(document("markClientAsNotFraud")); + } + +} \ No newline at end of file diff --git a/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy b/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy new file mode 100644 index 0000000000..c42d691b82 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsFraud.groovy @@ -0,0 +1,31 @@ +package contracts + +org.springframework.cloud.contract.spec.Contract.make { + request { + method 'PUT' + url '/fraudcheck' + body(""" + { + "clientId":"${value(consumer(regex('[0-9]{10}')))}", + "loanAmount":99999} + """ + ) + headers { + header('Content-Type', 'application/vnd.fraud.v1+json') + } + } + response { + status 200 + body( """{ + "fraudCheckStatus": "FRAUD", + "rejectionReason": "Amount too high" + }""") + headers { + header('Content-Type': value( + producer(regex('application/vnd.fraud.v1.json.*')), + consumer('application/vnd.fraud.v1+json')) + ) + } + } + +} diff --git a/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy b/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy new file mode 100644 index 0000000000..2b3bea7222 --- /dev/null +++ b/samples/standalone/restdocs/http-server/src/test/resources/contracts/shouldMarkClientAsNotFraud.groovy @@ -0,0 +1,33 @@ +package contracts + +org.springframework.cloud.contract.spec.Contract.make { + request { + method 'PUT' + url '/fraudcheck' + body(""" + { + "clientId":"${value(consumer(regex('[0-9]{10}')), producer('1234567890'))}", + "loanAmount":123.123 + } + """ + ) + headers { + header('Content-Type', 'application/vnd.fraud.v1+json') + } + + } + response { + status 200 + body( + fraudCheckStatus: "OK", + rejectionReason: $(consumer(null), producer(execute('assertThatRejectionReasonIsNull($it)'))) + ) + headers { + header('Content-Type': value( + producer(regex('application/vnd.fraud.v1.json.*')), + consumer('application/vnd.fraud.v1+json')) + ) + } + } + +} diff --git a/samples/standalone/restdocs/pom.xml b/samples/standalone/restdocs/pom.xml new file mode 100644 index 0000000000..ba2ef14b3b --- /dev/null +++ b/samples/standalone/restdocs/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + + org.springframework.cloud + spring-cloud-contract-samples-standalone + 1.0.0.BUILD-SNAPSHOT + .. + + + spring-cloud-contract-samples-restdocs + pom + + Spring Cloud Contract Standalone Test Samples + Spring Cloud Contract Standalone Test Samples used for end to end tests + + + http-server + http-client + + + + + + maven-deploy-plugin + + true + + + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.5 + + + + testCompile + + + + + + + + + diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 49415ce94f..a1f9205a69 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -44,10 +44,20 @@ org.springframework spring-web + + org.springframework.restdocs + spring-restdocs-mockmvc + true + org.springframework.boot spring-boot-starter-test true + + org.assertj + assertj-core + compile + diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/ContractRequestHandler.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/ContractRequestHandler.java new file mode 100644 index 0000000000..b3562adcbb --- /dev/null +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/ContractRequestHandler.java @@ -0,0 +1,140 @@ +/* + * Copyright 2012-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.contract.wiremock; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.nio.charset.Charset; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.ResultHandler; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StreamUtils; +import org.springframework.util.StringUtils; + +import com.jayway.jsonpath.JsonPath; + +public class ContractRequestHandler implements ResultHandler { + + private Map jsonPaths = new LinkedHashMap<>(); + private MediaType contentType; + private WireMockSnippet snippet; + + public ContractRequestHandler(WireMockSnippet snippet) { + this.snippet = snippet; + } + + @Override + public void handle(MvcResult result) throws Exception { + MockHttpServletRequest request = result.getRequest(); + String actual = StreamUtils.copyToString(request.getInputStream(), + Charset.forName("UTF-8")); + for (JsonPath jsonPath : jsonPaths.values()) { + new JsonPathValue(jsonPath, actual).assertHasValue(Object.class, "an object"); + } + snippet.setJsonPaths(jsonPaths.keySet()); + if (contentType != null) { + snippet.setContentType(contentType); + String resultType = request.getContentType(); + assertThat(resultType).isNotNull().as("no content type"); + assertThat(contentType.includes(MediaType.valueOf(resultType))).isTrue() + .as("content type did not match"); + } + } + + public ContractRequestHandler jsonPath(String expression, Object... args) { + compile(expression, args); + return this; + } + + public ContractRequestHandler contentType(MediaType contentType) { + this.contentType = contentType; + return this; + } + + private void compile(String expression, Object... args) { + org.springframework.util.Assert.hasText( + (expression == null ? null : expression.toString()), + "expression must not be null or empty"); + expression = String.format(expression.toString(), args); + jsonPaths.put(expression, JsonPath.compile(expression)); + } + +} + +class JsonPathValue { + + private final JsonPath jsonPath; + private final String expression; + private final CharSequence actual; + + JsonPathValue(JsonPath jsonPath, CharSequence actual) { + this.jsonPath = jsonPath; + this.actual = actual; + this.expression = jsonPath.getPath(); + } + + public void assertHasValue(Class type, String expectedDescription) { + Object value = getValue(true); + if (value == null || isIndefiniteAndEmpty()) { + throw new AssertionError(getNoValueMessage()); + } + if (type != null && !type.isInstance(value)) { + throw new AssertionError(getExpectedValueMessage(expectedDescription)); + } + } + + private boolean isIndefiniteAndEmpty() { + return !isDefinite() && isEmpty(); + } + + private boolean isDefinite() { + return this.jsonPath.isDefinite(); + } + + private boolean isEmpty() { + return ObjectUtils.isEmpty(getValue(false)); + } + + public Object getValue(boolean required) { + try { + CharSequence json = this.actual; + return this.jsonPath.read(json == null ? null : json.toString()); + } + catch (Exception ex) { + if (!required) { + return null; + } + throw new AssertionError(getNoValueMessage() + ". " + ex.getMessage()); + } + } + + private String getNoValueMessage() { + return "No value at JSON path \"" + this.expression + "\""; + } + + private String getExpectedValueMessage(String expectedDescription) { + return String.format("Expected %s at JSON path \"%s\" but found: %s", + expectedDescription, this.expression, + ObjectUtils.nullSafeToString(StringUtils.quoteIfString(getValue(false)))); + } + +} diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestDocsConfiguration.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestDocsConfiguration.java new file mode 100644 index 0000000000..6fe2838c30 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestDocsConfiguration.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.contract.wiremock; + +import org.springframework.boot.test.autoconfigure.restdocs.RestDocsMockMvcConfigurationCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer; + +/** + * @author Dave Syer + * + */ +@Configuration +public class WireMockRestDocsConfiguration + implements RestDocsMockMvcConfigurationCustomizer { + + @Override + public void customize(MockMvcRestDocumentationConfigurer configurer) { + configurer.snippets().withAdditionalDefaults(wireMockSnippet()); + } + + @Bean + public WireMockSnippet wireMockSnippet() { + return new WireMockSnippet(); + } + +} diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockSnippet.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockSnippet.java new file mode 100644 index 0000000000..d3131624a4 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockSnippet.java @@ -0,0 +1,164 @@ +/* + * Copyright 2012-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.contract.wiremock; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.delete; +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.matching; +import static com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.put; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; +import java.util.regex.Pattern; + +import org.springframework.http.MediaType; +import org.springframework.restdocs.RestDocumentationContext; +import org.springframework.restdocs.operation.Operation; +import org.springframework.restdocs.snippet.Snippet; + +import com.github.tomakehurst.wiremock.client.RemoteMappingBuilder; +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; +import com.github.tomakehurst.wiremock.common.Json; +import com.github.tomakehurst.wiremock.http.HttpHeader; +import com.github.tomakehurst.wiremock.http.HttpHeaders; +import com.github.tomakehurst.wiremock.matching.UrlPattern; + +public class WireMockSnippet implements Snippet { + + private String snippetName = "stubs"; + + private Set headerBlackList = new HashSet<>( + Arrays.asList("host", "content-length")); + + private Set jsonPaths = new LinkedHashSet<>(); + + private MediaType contentType; + + @Override + public void document(Operation operation) throws IOException { + String json = Json + .write(request(operation).willReturn(response(operation)).build()); + RestDocumentationContext context = (RestDocumentationContext) operation + .getAttributes().get(RestDocumentationContext.class.getName()); + File output = new File(context.getOutputDirectory(), + this.snippetName + "/" + operation.getName() + ".json"); + output.getParentFile().mkdirs(); + try (Writer writer = new OutputStreamWriter(new FileOutputStream(output))) { + writer.append(json); + } + } + + private ResponseDefinitionBuilder response(Operation operation) { + return aResponse().withHeaders(responseHeaders(operation)) + .withBody(operation.getResponse().getContentAsString()); + } + + private RemoteMappingBuilder request(Operation operation) { + return requestHeaders(requestBuilder(operation), operation); + } + + private RemoteMappingBuilder requestHeaders(RemoteMappingBuilder request, + Operation operation) { + org.springframework.http.HttpHeaders headers = operation.getRequest() + .getHeaders(); + // TODO: whitelist headers + for (String name : headers.keySet()) { + if (!headerBlackList.contains(name.toLowerCase())) { + if ("content-type".equalsIgnoreCase(name) && this.contentType != null) { + continue; + } + request = request.withHeader(name, equalTo(headers.getFirst(name))); + } + } + if (this.contentType != null) { + request = request.withHeader("Content-Type", + matching(Pattern.quote(this.contentType.toString()) + ".*")); + } + return request; + } + + private RemoteMappingBuilder requestBuilder(Operation operation) { + switch (operation.getRequest().getMethod()) { + case DELETE: + return delete(requestPattern(operation)); + case POST: + return bodyPattern(post(requestPattern(operation)), + operation.getRequest().getContentAsString()); + case PUT: + return bodyPattern(put(requestPattern(operation)), + operation.getRequest().getContentAsString()); + default: + return get(requestPattern(operation)); + } + } + + private RemoteMappingBuilder bodyPattern(RemoteMappingBuilder builder, + String content) { + if (jsonPaths != null) { + for (String jsonPath : jsonPaths) { + builder.withRequestBody(matchingJsonPath(jsonPath)); + } + } + else { + builder.withRequestBody(equalTo(content)); + } + return builder; + } + + private UrlPattern requestPattern(Operation operation) { + return urlEqualTo(operation.getRequest().getUri().getPath()); + } + + private HttpHeaders responseHeaders(Operation operation) { + org.springframework.http.HttpHeaders headers = operation.getResponse() + .getHeaders(); + HttpHeaders result = new HttpHeaders(); + for (String name : headers.keySet()) { + // TODO: whitelist the headers + if (!headerBlackList.contains(name.toLowerCase())) { + result = result.plus(new HttpHeader(name, headers.get(name))); + } + } + return result; + } + + public ContractRequestHandler content() { + return new ContractRequestHandler(this); + } + + public void setJsonPaths(Collection jsonPaths) { + this.jsonPaths = new LinkedHashSet<>(jsonPaths); + } + + public void setContentType(MediaType contentType) { + this.contentType = contentType; + } + +} \ No newline at end of file diff --git a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories index fcabcba368..331ad00862 100644 --- a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories @@ -1,3 +1,7 @@ # Application Listeners org.springframework.context.ApplicationListener=\ -org.springframework.cloud.contract.wiremock.WireMockApplicationListener \ No newline at end of file +org.springframework.cloud.contract.wiremock.WireMockApplicationListener + +# RestDocs Auto Configuration +org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs=\ +org.springframework.cloud.contract.wiremock.WireMockRestDocsConfiguration \ No newline at end of file diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java new file mode 100644 index 0000000000..e8f4059d27 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java @@ -0,0 +1,51 @@ +package org.springframework.cloud.contract.wiremock; + +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.contract.wiremock.WiremockServerRestDocsApplicationTests.TestConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = TestConfiguration.class) +@AutoConfigureRestDocs(outputDir = "target/snippets") +@AutoConfigureMockMvc +@DirtiesContext +public class WiremockServerRestDocsApplicationTests { + + @Autowired + private MockMvc mockMvc; + + @Test + public void contextLoads() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get("/resource")) + .andExpect(MockMvcResultMatchers.content().string("Hello World")) + .andDo(document("resource")); + } + + @Configuration + @RestController + protected static class TestConfiguration { + + @ResponseBody + @RequestMapping("/resource") + public String resource() { + return "Hello World"; + } + + } + +} diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java index a5d0a82167..3ae74cdd87 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockTestsApplication.java @@ -39,6 +39,7 @@ class Controller { public String home() { return this.service.go(); } + } @Component