Added isoDate, isoTime, isoDateTime

fixes #183
This commit is contained in:
Marcin Grzejszczak
2017-01-03 18:13:06 +01:00
parent 78ebacd9c5
commit b404369341
5 changed files with 129 additions and 21 deletions

View File

@@ -63,10 +63,25 @@ abstract class PatternValueDslProperty<T extends DslProperty> {
return createAndValidateProperty(RegexPatterns.URL, "http://foo" + this.random.nextInt() + ".com")
}
T anyUuid(){
T anyUuid() {
return createAndValidateProperty(RegexPatterns.UUID, UUID.randomUUID().toString())
}
T anyDate() {
int d = this.random.nextInt(8) + 1
return createAndValidateProperty(RegexPatterns.ANY_DATE, "201$d-0$d-1$d")
}
T anyDateTime() {
int d = this.random.nextInt(8) + 1
return createAndValidateProperty(RegexPatterns.ANY_DATE_TIME, "201$d-0$d-1${d}T12:23:34")
}
T anyTime() {
int d = this.random.nextInt(9)
return createAndValidateProperty(RegexPatterns.ANY_TIME, "12:2$d:3$d")
}
private static String randomString(int length) {
char[] characterSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray()
Random random = new Random()

View File

@@ -31,11 +31,14 @@ class RegexPatterns {
protected static final Pattern TRUE_OR_FALSE = Pattern.compile(/(true|false)/)
protected static final Pattern ONLY_ALPHA_UNICODE = Pattern.compile(/[\p{L}]*/)
protected static final Pattern NUMBER = Pattern.compile('-?\\d*(\\.\\d+)?')
protected static final Pattern IP_ADDRESS = Pattern.compile('([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])');
protected static final Pattern HOSTNAME_PATTERN = Pattern.compile('((http[s]?|ftp):\\/)\\/?([^:\\/\\s]+)(:[0-9]{1,5})?');
protected static final Pattern IP_ADDRESS = Pattern.compile('([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])')
protected static final Pattern HOSTNAME_PATTERN = Pattern.compile('((http[s]?|ftp):\\/)\\/?([^:\\/\\s]+)(:[0-9]{1,5})?')
protected static final Pattern EMAIL = Pattern.compile('[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}');
protected static final Pattern URL = Pattern.compile('((www\\.|(http|https|ftp|news|file)+\\:\\/\\/)[_.a-z0-9-]+\\.[a-z0-9\\/_:@=.+?,##%&~-]*[^.|\\\'|\\# |!|\\(|?|,| |>|<|;|\\)])')
protected static final Pattern UUID = Pattern.compile('[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}')
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])')
protected static final Pattern ANY_DATE_TIME = Pattern.compile('([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])')
protected static final Pattern ANY_TIME = Pattern.compile('(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])')
String onlyAlphaUnicode() {
return ONLY_ALPHA_UNICODE.pattern()
@@ -68,6 +71,19 @@ class RegexPatterns {
String uuid(){
return UUID.pattern()
}
String isoDate() {
return ANY_DATE.pattern()
}
String isoDateTime() {
return ANY_DATE_TIME.pattern()
}
String isoTime() {
return ANY_TIME.pattern()
}
// end::regexps[]
static String multipartParam(Object name, Object value) {

View File

@@ -66,25 +66,84 @@ class RegexPatternsSpec extends Specification {
def "should generate a regex for a number [#textToMatch] that is a match [#shouldMatch]"() {
expect:
shouldMatch == Pattern.compile(regexPatterns.number()).matcher(textToMatch).matches()
shouldMatch == Pattern.compile(regexPatterns.number()).matcher(textToMatch).matches()
where:
textToMatch || shouldMatch
'1' || true
'1.0' || true
'0.1' || true
'.1' || true
'1.' || false
textToMatch || shouldMatch
'1' || true
'1.0' || true
'0.1' || true
'.1' || true
'1.' || false
}
def "should generate a regex for a uuid [#textToMatch] that is a match [#shouldMatch]"() {
expect:
shouldMatch == Pattern.compile(regexPatterns.uuid()).matcher(textToMatch).matches()
shouldMatch == Pattern.compile(regexPatterns.uuid()).matcher(textToMatch).matches()
where:
textToMatch || shouldMatch
UUID.randomUUID().toString() || true
UUID.randomUUID().toString() || true
UUID.randomUUID().toString() + "!" || false
'dog' || false
'5' || false
UUID.randomUUID().toString() || true
UUID.randomUUID().toString() || true
UUID.randomUUID().toString() + "!" || false
'dog' || false
'5' || false
}
def "should generate a regex with date [#textToMatch] in YYYY-MM-DD format that should match [#shouldMatch]"() {
expect:
shouldMatch == Pattern.compile(regexPatterns.isoDate()).matcher(textToMatch).matches()
where:
textToMatch || shouldMatch
"2014-03-01" || true
"1014-03-01" || true
"1014-3-01" || false
"14-03-01" || false
"1014-12-01" || true
"1014-12-31" || true
"1014-12-1" || false
"1014-12-32" || false
"1014-13-31" || false
"1014-20-30" || false
'5' || false
}
def "should generate a regex with datetime [#textToMatch] in YYYY-MM-DDTHH:mm:ss format that should match [#shouldMatch]"() {
expect:
shouldMatch == Pattern.compile(regexPatterns.isoDateTime()).matcher(textToMatch).matches()
where:
textToMatch || shouldMatch
"2014-03-01T12:23:45" || true
"1014-03-01T23:59:59" || true
"1014-3-01T01:01:01" || false
"1014-03-01T00:00:00" || true
"1014-03-01T00:00:0" || false
"1014-03-01T00:0:01" || false
"1014-03-01T0:01:01" || false
"1014-03-0100:01:01" || false
"14-03-01T12:23:45" || false
"1014-12-01T12:23:45" || true
"1014-12-31T12:23:45" || true
"1014-12-1T12:23:45" || false
"1014-12-32T12:23:45" || false
"1014-13-31T12:23:45" || false
"1014-20-30T12:23:45" || false
"1014-20-30T24:23:45" || false
"1014-20-30T23:60:45" || false
"1014-20-30T23:59:60" || false
}
def "should generate a regex with time [#textToMatch] in HH:mm:ss format that should match [#shouldMatch]"() {
expect:
shouldMatch == Pattern.compile(regexPatterns.isoTime()).matcher(textToMatch).matches()
where:
textToMatch || shouldMatch
"12:23:45" || true
"23:59:59" || true
"00:00:00" || true
"00:00:0" || false
"00:0:01" || false
"0:01:01" || false
"24:23:45" || false
"23:60:45" || false
"23:59:60" || false
}
}

View File

@@ -993,7 +993,10 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub
hostname: $(anyHostname()),
email: $(anyEmail()),
url: $(anyUrl()),
uuid: $(anyUuid())
uuid: $(anyUuid()),
date: $(anyDate()),
dateTime: $(anyDateTime()),
time: $(anyTime())
])
headers {
contentType(applicationJson())
@@ -1009,7 +1012,10 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub
hostname: $(anyHostname()),
email: $(anyEmail()),
url: $(anyUrl()),
uuid: $(anyUuid())
uuid: $(anyUuid()),
date: $(anyDate()),
dateTime: $(anyDateTime()),
time: $(anyTime())
])
headers {
contentType(applicationJson())
@@ -1030,6 +1036,9 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub
test.contains('assertThatJson(parsedJson).field("email").matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4}")')
test.contains('assertThatJson(parsedJson).field("ip").matches("([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])")')
test.contains('assertThatJson(parsedJson).field("uuid").matches("[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}")')
test.contains('assertThatJson(parsedJson).field("date").matches("(\\\\d\\\\d\\\\d\\\\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")')
test.contains('assertThatJson(parsedJson).field("dateTime").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")')
test.contains('assertThatJson(parsedJson).field("time").matches("(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")')
!test.contains('cursor')
and:
SyntaxChecker.tryToCompile(methodBuilderName, blockBuilder.toString())

View File

@@ -1897,7 +1897,7 @@ World.'''"""
@Issue('#149')
@Unroll
def "should allow easier way of providing dynamic values"() {
def "should allow easier way of providing dynamic values for [#methodBuilderName]"() {
given:
Contract contractDsl = Contract.make {
request {
@@ -1912,7 +1912,10 @@ World.'''"""
hostname: $(anyHostname()),
email: $(anyEmail()),
url: $(anyUrl()),
uuid: $(anyUuid())
uuid: $(anyUuid()),
date: $(anyDate()),
dateTime: $(anyDateTime()),
time: $(anyTime())
])
headers {
contentType(applicationJson())
@@ -1928,7 +1931,10 @@ World.'''"""
hostname: $(anyHostname()),
email: $(anyEmail()),
url: $(anyUrl()),
uuid: $(anyUuid())
uuid: $(anyUuid()),
date: $(anyDate()),
dateTime: $(anyDateTime()),
time: $(anyTime())
])
headers {
contentType(applicationJson())
@@ -1949,6 +1955,9 @@ World.'''"""
test.contains('assertThatJson(parsedJson).field("email").matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4}")')
test.contains('assertThatJson(parsedJson).field("ip").matches("([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])")')
test.contains('assertThatJson(parsedJson).field("uuid").matches("[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}")')
test.contains('assertThatJson(parsedJson).field("date").matches("(\\\\d\\\\d\\\\d\\\\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])')
test.contains('assertThatJson(parsedJson).field("dateTime").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])')
test.contains('assertThatJson(parsedJson).field("time").matches("(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")')
!test.contains('cursor')
and:
SyntaxChecker.tryToCompile(methodBuilderName, blockBuilder.toString())