diff --git a/ctp-validators/src/main/kotlin/com/commercetools/rmf/validators/UriParameterCamelCaseRule.kt b/ctp-validators/src/main/kotlin/com/commercetools/rmf/validators/UriParameterCamelCaseRule.kt new file mode 100644 index 00000000..00311321 --- /dev/null +++ b/ctp-validators/src/main/kotlin/com/commercetools/rmf/validators/UriParameterCamelCaseRule.kt @@ -0,0 +1,38 @@ +package com.commercetools.rmf.validators + +import io.vrap.rmf.raml.model.resources.Resource +import io.vrap.rmf.raml.model.util.StringCaseFormat +import org.eclipse.emf.common.util.Diagnostic +import java.util.* + +@ValidatorSet +class UriParameterCamelCaseRule(severity: RuleSeverity, options: List? = null) : ResourcesRule(severity, options) { + + private val exclude: List = + (options?.filter { ruleOption -> ruleOption.type.lowercase(Locale.getDefault()) == RuleOptionType.EXCLUDE.toString() }?.map { ruleOption -> ruleOption.value }?.plus("") ?: defaultExcludes) + + override fun caseResource(resource: Resource): List { + val validationResults: MutableList = ArrayList() + + resource.relativeUri.variables.forEach { variableName -> + if (exclude.contains(variableName).not() && StringCaseFormat.LOWER_CAMEL_CASE.apply(variableName) != variableName) { + validationResults.add(create(resource, "URI parameter \"{0}\" in resource \"{1}\" must be lowerCamelCase", variableName, resource.fullUri.template)) + } + } + return validationResults + } + + companion object : ValidatorFactory { + private val defaultExcludes by lazy { listOf("") } + + @JvmStatic + override fun create(options: List?): UriParameterCamelCaseRule { + return UriParameterCamelCaseRule(RuleSeverity.ERROR, options) + } + + @JvmStatic + override fun create(severity: RuleSeverity, options: List?): UriParameterCamelCaseRule { + return UriParameterCamelCaseRule(severity, options) + } + } +} diff --git a/ctp-validators/src/test/groovy/com/commercetools/rmf/validators/ValidatorRulesTest.groovy b/ctp-validators/src/test/groovy/com/commercetools/rmf/validators/ValidatorRulesTest.groovy index fab0dcaa..88b6be72 100644 --- a/ctp-validators/src/test/groovy/com/commercetools/rmf/validators/ValidatorRulesTest.groovy +++ b/ctp-validators/src/test/groovy/com/commercetools/rmf/validators/ValidatorRulesTest.groovy @@ -475,57 +475,24 @@ class ValidatorRulesTest extends Specification implements ValidatorFixtures { result.validationResults.size() == 17 } - def "property min max abbreviation rule"() { + def "uri parameter camelCase rule"() { when: - def options = singletonList(new RuleOption(RuleOptionType.EXCLUDE.toString(), "InvalidMinMax:minimumExcluded")) - def validators = Arrays.asList(new TypesValidator(Arrays.asList(PropertyMinMaxAbbreviationRule.create(options)))) - def uri = uriFromClasspath("/property-minmax-abbreviation-rule.raml") + def options = singletonList(new RuleOption(RuleOptionType.EXCLUDE.toString(), "ID")) + def validators = Arrays.asList(new ResourcesValidator(Arrays.asList(UriParameterCamelCaseRule.create(options)))) + def uri = uriFromClasspath("/uri-parameter-camelcase-rule.raml") def result = new RamlModelBuilder(validators).buildApi(uri) then: - result.validationResults.size() == 8 - result.validationResults[0].message == "Property \"minimumQuantity\" of type \"InvalidMinMax\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[1].message == "Property \"maximumPrice\" of type \"InvalidMinMax\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[2].message == "Property \"minimumOrder\" of type \"InvalidMinMax\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[3].message == "Property \"maximumItems\" of type \"InvalidMinMax\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[4].message == "Property \"minimum\" of type \"InvalidMinMax\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[5].message == "Property \"maximum\" of type \"InvalidMinMax\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[6].message == "Property \"minimumTypeNumber\" of type \"InvalidMinMax\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[7].message == "Property \"minimumNumber\" of type \"InvalidMinMax\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - } - - def "property min max abbreviation rule without exclusions"() { - when: - def validators = Arrays.asList(new TypesValidator(Arrays.asList(PropertyMinMaxAbbreviationRule.create(emptyList())))) - def uri = uriFromClasspath("/property-minmax-abbreviation-rule.raml") - def result = new RamlModelBuilder(validators).buildApi(uri) - then: - result.validationResults.size() == 9 - } - - def "parameter min max abbreviation rule"() { - when: - def options = singletonList(new RuleOption(RuleOptionType.EXCLUDE.toString(), "minimumExcluded")) - def validators = Arrays.asList(new ResourcesValidator(Arrays.asList(ParameterMinMaxAbbreviationRule.create(options)))) - def uri = uriFromClasspath("/parameter-minmax-abbreviation-rule.raml") - def result = new RamlModelBuilder(validators).buildApi(uri) - then: - result.validationResults.size() == 8 - result.validationResults[0].message == "Query parameter \"minimumQuantity\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[1].message == "Query parameter \"maximumPrice\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[2].message == "Query parameter \"minimum\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[3].message == "Query parameter \"maximum\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[4].message == "Query parameter \"minimumTypeNumber\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[5].message == "Query parameter \"minimumDescNumber\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[6].message == "Header \"minimumRetry\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" - result.validationResults[7].message == "Header \"maximumRetry\" must use \"min\"/\"max\" instead of \"minimum\"/\"maximum\"" + result.validationResults.size() == 2 + result.validationResults[0].message == "URI parameter \"productID\" in resource \"/{projectKey}/invalid/{productID}\" must be lowerCamelCase" + result.validationResults[1].message == "URI parameter \"BusinessUnitKey\" in resource \"/{projectKey}/invalid/{BusinessUnitKey}\" must be lowerCamelCase" } - def "parameter min max abbreviation rule without exclusions"() { + def "uri parameter camelCase rule without exclusions"() { when: - def validators = Arrays.asList(new ResourcesValidator(Arrays.asList(ParameterMinMaxAbbreviationRule.create(emptyList())))) - def uri = uriFromClasspath("/parameter-minmax-abbreviation-rule.raml") + def validators = Arrays.asList(new ResourcesValidator(Arrays.asList(UriParameterCamelCaseRule.create(emptyList())))) + def uri = uriFromClasspath("/uri-parameter-camelcase-rule.raml") def result = new RamlModelBuilder(validators).buildApi(uri) then: - result.validationResults.size() == 9 + result.validationResults.size() == 3 } } diff --git a/ctp-validators/src/test/resources/uri-parameter-camelcase-rule.raml b/ctp-validators/src/test/resources/uri-parameter-camelcase-rule.raml new file mode 100644 index 00000000..ef433a26 --- /dev/null +++ b/ctp-validators/src/test/resources/uri-parameter-camelcase-rule.raml @@ -0,0 +1,12 @@ +#%RAML 1.0 +title: uri parameter camelCase rule + +/{projectKey}: + /valid: + /{id}: + /key={key}: + /{associateId}: + /invalid: + /{ID}: + /{productID}: + /{BusinessUnitKey}: