kpschmidt
kpschmidt

Reputation: 245

Trouble using #regex marker

I'm having trouble constructing a proper #regex marker.

I'm trying to match on a couple of date formats in my response JSON:

"created": "2017-03-23T14:16:25.854Z" "modified": "2018-06-21T05:38:37.978Z"

I've attempted the following markers:

'#regex [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z' '#regex [0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.' '#regex \d+-\d+-\d+.\d+:\d+:\d+.\d+.'

All 3 forms appear to be correct (according to rubular.com). I've also played around with escaping characters that might be problematic. The only one I been able to get tot work so far is:

[0-9-T:.Z]+

But this feels a little "loose" of a pattern match.

Basically I'm attempting this:

* def meta = { created: '#regex[[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.]', modified: '#regex[[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}.]' } And match each response == """ { id: '#regex [a-z0-9]+', name: '#string', type: '<Type>', meta: #(meta), integration_id: '#uuid' } """

Get an error similar to this:

KarateException: objects-api.feature:40 - path: $[0].meta.created, actual: '2016-11-30T20:48:16.782Z', expected: '#regex [0-9]+-[0-9]+-[0-9]+[0-9]+:[0-9]+:[0-9]+[0-9]+', reason: regex match failed

Upvotes: 2

Views: 756

Answers (1)

Peter Thomas
Peter Thomas

Reputation: 58058

Here is a suggestion, why don't you parse the dates into java Date objects and that will open up more possibilities such as being able to compare 2 dates.

Here are good examples: https://stackoverflow.com/a/54133126/143475 https://stackoverflow.com/a/55938480/143475

That said, I think you missed having to escape the backslash-es, this is a Java thing and is mentioned in the docs. So this works:

* def date = '2017-03-23T14:16:25.854Z'
* match date == '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.'
* match date == '#regex [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z'

The Karate JS engine also supports the RegExp JS object, so see if this example gives you some solutions as well:

https://stackoverflow.com/a/54768838/143475

EDIT, this works for me as well:

* def meta = { created: '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.', modified: '#regex \\d+-\\d+-\\d+.\\d+:\\d+:\\d+.\\d+.' }
* def response = [{ meta: { created: '2017-03-23T14:16:25.854Z', modified: '2018-06-21T05:38:37.978Z' } }]
* match each response == { meta: '#(meta)' }

Upvotes: 1

Related Questions