Fixed invalid contract package string
without this change we were matching the package for contracts with _REPLACEME_ text in it with this change we're checking it against the package for contracts in a proper way fixes gh-701
This commit is contained in:
@@ -20,7 +20,10 @@ import java.nio.charset.StandardCharsets
|
||||
import java.nio.file.Path
|
||||
import java.util.concurrent.atomic.AtomicInteger
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.PackageScope
|
||||
import org.apache.commons.logging.Log
|
||||
import org.apache.commons.logging.LogFactory
|
||||
import wiremock.com.google.common.collect.ListMultimap
|
||||
|
||||
import org.springframework.cloud.contract.spec.ContractVerifierException
|
||||
@@ -37,13 +40,16 @@ import static org.springframework.cloud.contract.verifier.util.NamesUtil.beforeL
|
||||
import static org.springframework.cloud.contract.verifier.util.NamesUtil.convertIllegalPackageChars
|
||||
import static org.springframework.cloud.contract.verifier.util.NamesUtil.directoryToPackage
|
||||
import static org.springframework.cloud.contract.verifier.util.NamesUtil.toLastDot
|
||||
|
||||
/**
|
||||
* @author Jakub Kubrynski, codearte.io
|
||||
*/
|
||||
@CompileStatic
|
||||
class TestGenerator {
|
||||
|
||||
private static final String DEFAULT_CLASS_PREFIX = "ContractVerifier"
|
||||
private static final String DEFAULT_TEST_PACKAGE = "org.springframework.cloud.contract.verifier.tests"
|
||||
private static final Log log = LogFactory.getLog(TestGenerator)
|
||||
|
||||
private final ContractVerifierConfigProperties configProperties
|
||||
private AtomicInteger counter = new AtomicInteger()
|
||||
@@ -101,7 +107,7 @@ class TestGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
private String relativizeContractPath(Map.Entry<Path, Collection<Path>> entry) {
|
||||
private String relativizeContractPath(Map.Entry<Path, Collection<ContractMetadata>> entry) {
|
||||
Path relativePath = configProperties.contractsDslDir.toPath().relativize(entry.getKey())
|
||||
if (StringUtils.isEmpty(relativePath.toString())) {
|
||||
return DEFAULT_CLASS_PREFIX
|
||||
@@ -111,8 +117,11 @@ class TestGenerator {
|
||||
|
||||
private void processIncludedDirectory(
|
||||
final String includedDirectoryRelativePath, Collection<ContractMetadata> contracts, final String basePackageNameForClass) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Included directory relative path is [${includedDirectoryRelativePath}]")
|
||||
}
|
||||
if (contracts.size()) {
|
||||
def className = afterLast(includedDirectoryRelativePath.toString(), File.separator) + resolveNameSuffix()
|
||||
def className = afterLast(includedDirectoryRelativePath, File.separator) + resolveNameSuffix()
|
||||
def convertedClassName = convertIllegalPackageChars(className)
|
||||
def packageName = buildPackage(basePackageNameForClass, includedDirectoryRelativePath)
|
||||
def classBytes = generator.buildClass(configProperties, contracts, convertedClassName, packageName, includedDirectoryRelativePath).getBytes(StandardCharsets.UTF_8)
|
||||
|
||||
@@ -18,6 +18,9 @@ package org.springframework.cloud.contract.verifier.builder
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.PackageScope
|
||||
import org.apache.commons.logging.Log
|
||||
import org.apache.commons.logging.LogFactory
|
||||
|
||||
import org.springframework.cloud.contract.verifier.config.TestFramework
|
||||
import org.springframework.cloud.contract.verifier.util.NamesUtil
|
||||
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
|
||||
@@ -33,6 +36,8 @@ import org.springframework.cloud.contract.verifier.config.ContractVerifierConfig
|
||||
@PackageScope
|
||||
class ClassBuilder {
|
||||
|
||||
private static final Log log = LogFactory.getLog(ClassBuilder)
|
||||
|
||||
private static final String SEPARATOR = "_REPLACEME_"
|
||||
|
||||
private final String className
|
||||
@@ -72,11 +77,15 @@ class ClassBuilder {
|
||||
}
|
||||
|
||||
protected static String retrieveBaseClass(ContractVerifierConfigProperties properties, String includedDirectoryRelativePath) {
|
||||
String contractPathAsPackage = includedDirectoryRelativePath.replace(File.separator, ".")
|
||||
String contractPackage = includedDirectoryRelativePath.replace(File.separator, SEPARATOR)
|
||||
// package mapping takes super precedence
|
||||
if (properties.baseClassMappings) {
|
||||
Map.Entry<String, String> mapping = properties.baseClassMappings.find { String pattern, String fqn ->
|
||||
return contractPackage.matches(pattern)
|
||||
return contractPathAsPackage.matches(pattern)
|
||||
}
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Matching pattern for contract package [${contractPathAsPackage}] with setup ${properties.baseClassMappings} is [${mapping}]")
|
||||
}
|
||||
if (mapping) {
|
||||
return mapping.value
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.springframework.cloud.contract.verifier.builder
|
||||
|
||||
import spock.lang.Issue
|
||||
|
||||
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
|
||||
import spock.lang.Specification
|
||||
|
||||
@@ -49,6 +51,16 @@ class ClassBuilderSpec extends Specification {
|
||||
ClassBuilder.retrieveBaseClass(props, contractRelativeFolder) == 'com.example.base.SuperClass'
|
||||
}
|
||||
|
||||
@Issue("701")
|
||||
def "should match base class when mapping regex has multiple folders"() {
|
||||
given:
|
||||
ContractVerifierConfigProperties props = new ContractVerifierConfigProperties(
|
||||
baseClassMappings: ['.*bar.baz.some.*' : 'com.example.base.SuperClass'])
|
||||
String contractRelativeFolder = 'foo/bar/baz/some/package'.split("/").join(File.separator)
|
||||
expect:
|
||||
ClassBuilder.retrieveBaseClass(props, contractRelativeFolder) == 'com.example.base.SuperClass'
|
||||
}
|
||||
|
||||
def "should return the first matching base class when provided mapping doesn't match"() {
|
||||
given:
|
||||
ContractVerifierConfigProperties props = new ContractVerifierConfigProperties(
|
||||
|
||||
Reference in New Issue
Block a user