Merge remote-tracking branch 'origin/2.2.x'

# Conflicts:
#	pom.xml
This commit is contained in:
Olga Maciaszek-Sharma
2020-05-08 18:17:20 +02:00
3 changed files with 91 additions and 15 deletions

View File

@@ -44,7 +44,7 @@ class ContractVerifierDslConverter implements ContractConverter<Collection<Contr
public static final ContractVerifierDslConverter INSTANCE = new ContractVerifierDslConverter()
private static final Pattern PACKAGE_PATTERN = Pattern.compile(".+?package (.+?);.+?", Pattern.DOTALL)
private static final Pattern PACKAGE_PATTERN = Pattern.compile(".*package (.+?);.+?", Pattern.DOTALL)
private static final Pattern CLASS_PATTERN = Pattern.compile(".+?class (.+?)( |\\{).+?", Pattern.DOTALL)

View File

@@ -17,6 +17,7 @@
package org.springframework.cloud.contract.verifier.converter
import groovy.json.JsonSlurper
import spock.lang.Issue
import spock.lang.Shared
import spock.lang.Specification
@@ -37,33 +38,39 @@ import static org.springframework.cloud.contract.spec.internal.MatchingType.REGE
class JavaContractConverterSpec extends Specification {
@Shared
URL javaRest = JavaContractConverterSpec.getResource("/contractsToCompile/contract_rest.java")
URL javaRest = JavaContractConverterSpec.
getResource("/contractsToCompile/contract_rest.java")
@Shared
File javaRestFile = new File(javaRest.toURI())
@Shared
URL javaRestWithTags = JavaContractConverterSpec.getResource("/contractsToCompile/contract_rest_with_tags.java")
URL javaRestWithTags = JavaContractConverterSpec.
getResource("/contractsToCompile/contract_rest_with_tags.java")
@Shared
File javaRestWithTagsFile = new File(javaRestWithTags.toURI())
@Shared
URL contractBody = JavaContractConverterSpec.getResource("/contractsToCompile/contract_rest_from_file.java")
URL contractBody = JavaContractConverterSpec.
getResource("/contractsToCompile/contract_rest_from_file.java")
@Shared
File contractBodyFile = new File(contractBody.toURI())
@Shared
URL contractBodyBytes = JavaContractConverterSpec.getResource("/contractsToCompile/contract_rest_from_pdf.java")
URL contractBodyBytes = JavaContractConverterSpec.
getResource("/contractsToCompile/contract_rest_from_pdf.java")
@Shared
File contractBodyBytesFile = new File(contractBodyBytes.toURI())
@Shared
URL docs = JavaContractConverterSpec.getResource("/contractsToCompile/contract_docs_examples.java")
URL docs = JavaContractConverterSpec.
getResource("/contractsToCompile/contract_docs_examples.java")
@Shared
File docsFile = new File(docs.toURI())
def "should convert Java DSL with REST to DSL for [#contractFile]"() {
when:
Collection<Contract> contracts = ContractVerifierDslConverter.convertAsCollection(contractFile.parentFile, contractFile)
Collection<Contract> contracts = ContractVerifierDslConverter.
convertAsCollection(contractFile.parentFile, contractFile)
then:
Contract contract = contracts.first()
contract.description == "Some description"
@@ -79,7 +86,8 @@ class JavaContractConverterSpec extends Specification {
contract.request.method.clientValue == "PUT"
contract.request.headers.entries.find {
it.name == "foo" &&
((RegexProperty) it.clientValue).pattern() == "bar" && it.serverValue == "bar"
((RegexProperty) it.clientValue).pattern() == "bar" &&
it.serverValue == "bar"
}
contract.request.headers.entries.find {
it.name == "fooReq" &&
@@ -94,23 +102,27 @@ class JavaContractConverterSpec extends Specification {
contract.response.delay.clientValue == 1000
contract.response.headers.entries.find {
it.name == "foo2" &&
((RegexProperty) it.serverValue).pattern() == "bar" && it.clientValue == "bar"
((RegexProperty) it.serverValue).pattern() == "bar" &&
it.clientValue == "bar"
}
contract.response.headers.entries.find {
it.name == "foo3" &&
((ExecutionProperty) it.serverValue).insertValue('foo') == "andMeToo(foo)"
((ExecutionProperty) it.serverValue).
insertValue('foo') == "andMeToo(foo)"
}
contract.response.headers.entries.find {
it.name == "fooRes" &&
it.clientValue == "baz"
}
MapConverter.getStubSideValues(contract.response.body) == [foo2: "bar", foo3: "baz", nullValue: null]
MapConverter.getStubSideValues(
contract.response.body) == [foo2: "bar", foo3: "baz", nullValue: null]
contract.response.bodyMatchers.matchers[0].path() == '$.foo2'
contract.response.bodyMatchers.matchers[0].matchingType() == REGEX
contract.response.bodyMatchers.matchers[0].value().pattern() == 'bar'
contract.response.bodyMatchers.matchers[1].path() == '$.foo3'
contract.response.bodyMatchers.matchers[1].matchingType() == COMMAND
contract.response.bodyMatchers.matchers[1].value() == new ExecutionProperty('executeMe($it)')
contract.response.bodyMatchers.matchers[1].
value() == new ExecutionProperty('executeMe($it)')
contract.response.bodyMatchers.matchers[2].path() == '$.nullValue'
contract.response.bodyMatchers.matchers[2].matchingType() == NULL
contract.response.bodyMatchers.matchers[2].value() == null
@@ -120,7 +132,8 @@ class JavaContractConverterSpec extends Specification {
def "should convert java with REST with body from file"() {
when:
Collection<Contract> contracts = ContractVerifierDslConverter.convertAsCollection(contractBodyFile.parentFile, contractBodyFile)
Collection<Contract> contracts = ContractVerifierDslConverter.
convertAsCollection(contractBodyFile.parentFile, contractBodyFile)
then:
contracts.size() == 1
Contract contract = contracts.first()
@@ -133,7 +146,9 @@ class JavaContractConverterSpec extends Specification {
def "should convert java with REST with body as bytes"() {
when:
Collection<Contract> contracts = ContractVerifierDslConverter.convertAsCollection(contractBodyBytesFile.parentFile, contractBodyBytesFile)
Collection<Contract> contracts = ContractVerifierDslConverter.
convertAsCollection(
contractBodyBytesFile.parentFile, contractBodyBytesFile)
then:
contracts.size() == 1
Contract contract = contracts.first()
@@ -144,7 +159,36 @@ class JavaContractConverterSpec extends Specification {
def "should convert java with REST for docs"() {
when:
Collection<Contract> contracts = ContractVerifierDslConverter.convertAsCollection(docsFile.parentFile, docsFile)
Collection<Contract> contracts = ContractVerifierDslConverter.
convertAsCollection(docsFile.parentFile, docsFile)
then:
contracts.size() == 1
}
@Issue("1398")
def "should work when contract starts with 'package'"() {
given:
URL packageContract = JavaContractConverterSpec.
getResource("/contractsToCompile/package_contract.java")
File packageFile = new File(packageContract.toURI())
when:
Collection<Contract> contracts = ContractVerifierDslConverter.
convertAsCollection(packageFile.parentFile, packageFile)
then:
contracts.size() == 1
}
@Issue("1398")
def "should work when 'contract starts with 'package' preceded by other text"() {
given:
URL contract = JavaContractConverterSpec.
getResource("/contractsToCompile/contract.java")
File contractFile = new File(contract.toURI())
when:
Collection<Contract> contracts = ContractVerifierDslConverter.
convertAsCollection(contractFile.parentFile, contractFile)
then:
contracts.size() == 1
}

View File

@@ -0,0 +1,32 @@
package example;
import java.util.Collection;
import java.util.Collections;
import java.util.function.Supplier;
import org.springframework.cloud.contract.spec.Contract;
class package_contract implements Supplier<Collection<Contract>> {
@Override
public Collection<Contract> get() {
return Collections.singletonList(Contract.make(c -> {
c.request(r -> {
r.method(r.PUT());
r.headers(h -> {
h.contentType(h.applicationJson());
});
r.body(" { \"status\" : \"OK\" } ");
r.url("/1");
});
c.response(r -> {
r.status(r.OK());
r.body(" { \"status\" : \"OK\" } ");
r.headers(h -> {
h.contentType(h.textPlain());
});
});
}));
}
}