diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilder.groovy index b6067197b6..66e97b2e83 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilder.groovy @@ -61,7 +61,7 @@ class MethodBuilder { return new MethodBuilder(methodName, stubContent, configProperties, contract.ignored || stubContent.ignored) } - private static String methodName(ContractMetadata contract, File stubsFile, Contract stubContent) { + static String methodName(ContractMetadata contract, File stubsFile, Contract stubContent) { if (stubContent.name) { return NamesUtil.camelCase(NamesUtil.convertIllegalPackageChars(stubContent.name)) } else if (contract.convertedContract.size() > 1) { @@ -72,7 +72,7 @@ class MethodBuilder { } private static String camelCasedMethodFromFileName(File stubsFile) { - return NamesUtil.camelCase(NamesUtil.toLastDot(NamesUtil.afterLast(stubsFile.path, File.separator))) + return NamesUtil.camelCase(NamesUtil.convertIllegalMethodNameChars(NamesUtil.toLastDot(NamesUtil.afterLast(stubsFile.path, File.separator)))) } /** diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/NamesUtil.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/NamesUtil.groovy index 0a80145e4c..7368e51821 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/NamesUtil.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/NamesUtil.groovy @@ -111,4 +111,13 @@ class NamesUtil { static String convertIllegalPackageChars(String packageName) { return packageName.replaceAll('[_\\- .+]', '_') } + + /** + * Converts illegal characters in method names to underscores + */ + static String convertIllegalMethodNameChars(String methodName) { + String result = methodName.replaceAll('^[^a-zA-Z_$]', '_') + result = result.replaceAll('[^a-zA-Z_$0-9]', '_') + return result + } } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilderSpec.groovy new file mode 100644 index 0000000000..f54214c6b3 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBuilderSpec.groovy @@ -0,0 +1,34 @@ +package org.springframework.cloud.contract.verifier.builder + +import org.springframework.cloud.contract.spec.Contract +import org.springframework.cloud.contract.verifier.file.ContractMetadata +import spock.lang.Issue +import spock.lang.Specification + +class MethodBuilderSpec extends Specification { + + @Issue('#518') + def "should map create valid method name from file name containing illegal chars"() { + given: + Contract contractDsl = Contract.make { + request { + method 'GET' + urlPath '/foo' + } + response { + status 200 + body(foo: "foo") + headers { + contentType(applicationJson()) + } + } + } + ContractMetadata metadata = new ContractMetadata(null, false, 0, null, contractDsl) + when: + File stubFile = new File("5invalid-method:name.groovy") + String methodName = MethodBuilder.methodName(metadata, stubFile, contractDsl) + then: + methodName.equals("_invalid_method_name") + } + +} diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/NamesUtilSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/NamesUtilSpec.groovy index 23903c89bb..bb3502ab0f 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/NamesUtilSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/NamesUtilSpec.groovy @@ -104,4 +104,11 @@ class NamesUtilSpec extends Specification { expect: NamesUtil.convertIllegalPackageChars(string) == "a_b_c_1_0_x_d1174dd" } + + def "should convert all illegal method chars to legal ones"() { + given: + String string = '10a-b c.1.0.x+d1174$dd' + expect: + NamesUtil.convertIllegalMethodNameChars(string) == '_0a_b_c_1_0_x_d1174$dd' + } }