diff --git a/samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java index cf26b27f35..beae2c7594 100644 --- a/samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java +++ b/samples/standalone/dsl/http-client/src/main/java/com/example/loan/LoanApplicationService.java @@ -86,6 +86,17 @@ public class LoanApplicationService { return response.getBody().getCount(); } + public String getCookies() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Cookie", "name=foo"); + httpHeaders.add("Cookie", "name2=bar"); + ResponseEntity response = + restTemplate.exchange("http://localhost:" + port + "/frauds/name", HttpMethod.GET, + new HttpEntity<>(httpHeaders), + String.class); + return response.getBody(); + } + public void setPort(int port) { this.port = port; } diff --git a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java index 6a7bc3d207..97ff1f3e34 100644 --- a/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java +++ b/samples/standalone/dsl/http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java @@ -71,4 +71,12 @@ public class LoanApplicationServiceTests { assertThat(count).isEqualTo(100); } + @Test + public void shouldSuccessfullyGetCookies() { + // when: + String cookies = service.getCookies(); + // then: + assertThat(cookies).isEqualTo("foo bar"); + } + } diff --git a/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudNameController.java b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudNameController.java index 4ba6881594..fe99c7c713 100644 --- a/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudNameController.java +++ b/samples/standalone/dsl/http-server/src/main/java/com/example/fraud/FraudNameController.java @@ -1,5 +1,7 @@ package com.example.fraud; +import org.springframework.web.bind.annotation.CookieValue; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -24,6 +26,12 @@ class FraudNameController { } return new NameResponse("Don't worry " + request.getName() + " you're not a fraud"); } + + @GetMapping(value = "/frauds/name") + public String checkByName(@CookieValue("name") String value, + @CookieValue("name2") String value2) { + return value + " " + value2; + } } interface FraudVerifier { diff --git a/samples/standalone/dsl/http-server/src/test/resources/contracts/fraudname/shouldReturnACookie.groovy b/samples/standalone/dsl/http-server/src/test/resources/contracts/fraudname/shouldReturnACookie.groovy new file mode 100644 index 0000000000..54983e928e --- /dev/null +++ b/samples/standalone/dsl/http-server/src/test/resources/contracts/fraudname/shouldReturnACookie.groovy @@ -0,0 +1,16 @@ +package contracts.fraudname + +org.springframework.cloud.contract.spec.Contract.make { + request { + method GET() + url '/frauds/name' + cookies { + cookie("name", "foo") + cookie(name2: "bar") + } + } + response { + status 200 + body("foo bar") + } +} \ No newline at end of file diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Cookies.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Cookies.groovy index 9c654d641f..29b7472de3 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Cookies.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/Cookies.groovy @@ -31,19 +31,19 @@ import groovy.transform.TypeChecked @TypeChecked class Cookies { - Set cookies = [] + Set entries = [] void cookie(Map singleCookie) { Map.Entry first = singleCookie.entrySet().first() - cookies << new Cookie(first?.key, first?.value) + entries << new Cookie(first?.key, first?.value) } void cookie(String cookieKey, Object cookieValue) { - cookies << new Cookie(cookieKey, cookieValue) + entries << new Cookie(cookieKey, cookieValue) } void executeForEachCookie(Closure closure) { - cookies?.each { + entries?.each { cookie -> closure(cookie) } } @@ -56,11 +56,11 @@ class Cookies { if (this.is(o)) return true if (getClass() != o.class) return false Cookies cookies = (Cookies) o - if (cookies != cookies.cookies) return false + if (cookies != cookies.entries) return false return true } int hashCode() { - return cookies.hashCode() + return entries.hashCode() } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.jar b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 3baa851b28..0000000000 Binary files a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.properties index 95d7279349..e69de29bb2 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +0,0 @@ -#Fri Aug 19 15:38:58 CEST 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/m2repo/repository/com/example/jersey-contracts/0.0.1-SNAPSHOT/jersey-contracts-0.0.1-SNAPSHOT.jar b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/m2repo/repository/com/example/jersey-contracts/0.0.1-SNAPSHOT/jersey-contracts-0.0.1-SNAPSHOT.jar index 04621a7bb9..8de83843d0 100644 Binary files a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/m2repo/repository/com/example/jersey-contracts/0.0.1-SNAPSHOT/jersey-contracts-0.0.1-SNAPSHOT.jar and b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/m2repo/repository/com/example/jersey-contracts/0.0.1-SNAPSHOT/jersey-contracts-0.0.1-SNAPSHOT.jar differ diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/m2repo/repository/com/example/jersey-contracts/0.0.1-SNAPSHOT/maven-metadata-local.xml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/m2repo/repository/com/example/jersey-contracts/0.0.1-SNAPSHOT/maven-metadata-local.xml index 05d9ce3299..b6f14758ae 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/m2repo/repository/com/example/jersey-contracts/0.0.1-SNAPSHOT/maven-metadata-local.xml +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/m2repo/repository/com/example/jersey-contracts/0.0.1-SNAPSHOT/maven-metadata-local.xml @@ -12,7 +12,7 @@ jar 0.0.1-SNAPSHOT - 20160916125313 + 20170916125313 pom diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy index 1550e13773..c19f145576 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy @@ -23,6 +23,7 @@ import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder import com.github.tomakehurst.wiremock.matching.StringValuePattern import com.github.tomakehurst.wiremock.matching.UrlPattern import groovy.json.JsonOutput +import groovy.transform.CompileDynamic import groovy.transform.PackageScope import groovy.transform.TypeChecked import groovy.transform.TypeCheckingMode @@ -72,6 +73,7 @@ class WireMockRequestStubStrategy extends BaseWireMockStubStrategy { } RequestPatternBuilder requestPatternBuilder = appendMethodAndUrl() appendHeaders(requestPatternBuilder) + appendCookies(requestPatternBuilder) appendQueryParameters(requestPatternBuilder) appendBody(requestPatternBuilder) appendMultipart(requestPatternBuilder) @@ -148,6 +150,15 @@ class WireMockRequestStubStrategy extends BaseWireMockStubStrategy { } } + private void appendCookies(RequestPatternBuilder requestPattern) { + if(!request.cookies) { + return + } + request.cookies.entries.each { + requestPattern.withCookie(it.key, convertToValuePattern(it.clientValue)) + } + } + private UrlPattern urlPattern() { Object urlPath = urlPathOrUrlIfQueryPresent() if (urlPath) { @@ -293,6 +304,7 @@ class WireMockRequestStubStrategy extends BaseWireMockStubStrategy { return containsPattern(map.entrySet()) } + @CompileDynamic private boolean containsPattern(Collection collection) { return collection.collect(this.&containsPattern).inject('') { a, b -> a || b } } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy index dc31b06385..991131503b 100755 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/WireMockGroovyDslSpec.groovy @@ -1750,6 +1750,9 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie header(authorization(), "secret") header(authorization(), "secret2") } + cookies { + cookie("foo", "bar") + } body(foo: "bar", baz: 5) } response { @@ -1785,6 +1788,11 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie "equalTo" : "secret2" } }, + "cookies" : { + "foo" : { + "equalTo" : "bar" + } + }, "queryParameters" : { "foo" : { "equalTo" : "bar2" @@ -2017,6 +2025,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie RequestEntity.post(URI.create("http://localhost:" + port + "/api/v1/xxxx?foo=bar&foo=bar2")) .header("Authorization", "secret") .header("Authorization", "secret2") + .header("Cookie", "foo=bar") .body("{\"foo\":\"bar\",\"baz\":5}"), String.class) } } \ No newline at end of file