diff --git a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java index fbeac94183..7205b8d00f 100644 --- a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java +++ b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/RegexPatterns.java @@ -66,7 +66,10 @@ public final class RegexPatterns { protected static final Pattern HTTPS_URL = UrlHelper.HTTPS_URL; protected static final Pattern UUID = Pattern - .compile("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"); + .compile("[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}", Pattern.CASE_INSENSITIVE); + + protected static final Pattern UUID4 = Pattern + .compile("[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}", Pattern.CASE_INSENSITIVE); protected static final Pattern ANY_DATE = Pattern .compile("(\\d\\d\\d\\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])"); @@ -164,6 +167,10 @@ public final class RegexPatterns { return new RegexProperty(UUID).asString(); } + public static RegexProperty uuid4() { + return new RegexProperty(UUID4).asString(); + } + public static RegexProperty isoDate() { return new RegexProperty(ANY_DATE).asString(); } diff --git a/specs/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/RegexPatternsSpec.groovy b/specs/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/RegexPatternsSpec.groovy index 5282acc28f..97334d1cbd 100644 --- a/specs/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/RegexPatternsSpec.groovy +++ b/specs/spring-cloud-contract-spec/src/test/groovy/org/springframework/cloud/contract/spec/internal/RegexPatternsSpec.groovy @@ -237,13 +237,34 @@ class RegexPatternsSpec extends Specification { def "should generate a regex for a uuid [#textToMatch] that is a match [#shouldMatch]"() { expect: - shouldMatch == RegexPatterns.uuid().matcher(textToMatch).matches() + shouldMatch == RegexPatterns.uuid().matcher(textToMatch).matches() + where: + textToMatch || shouldMatch + UUID.randomUUID().toString() || true + UUID.randomUUID().toString() || true + UUID.randomUUID().toString().toUpperCase() || true + UUID.randomUUID().toString() + "!" || false + '23e4567-z89b-12z3-j456-426655440000' || false + 'dog' || false + '5' || false + } + + def "should generate a regex for a uuidv4 [#textToMatch] that is a match [#shouldMatch]"() { + expect: + shouldMatch == RegexPatterns.uuid4().matcher(textToMatch).matches() where: textToMatch || shouldMatch UUID.randomUUID().toString() || true UUID.randomUUID().toString() || true + UUID.randomUUID().toString().toUpperCase() || true + '123e4567-e89b-42d3-a456-556642440000' || true + '00000000-0000-4000-8000-000000000000' || true + '00000000-0000-4000-9000-000000000000' || true + '00000000-0000-4000-a000-000000000000' || true + '00000000-0000-4000-b000-000000000000' || true + '00000000-0000-4000-1000-000000000000' || false UUID.randomUUID().toString() + "!" || false - '23e4567-z89b-12z3-j456-426655440000' || false + '00000000-0000-0000-0000-000000000000' || false 'dog' || false '5' || false }