1

I'm trying to use retry, to check if an object containing a given ID is present in the answer.

Here is one of the attempts I made :

Background:
* url 'https://jsonplaceholder.typicode.com'

Scenario: get all users and then get the first user by id

Given path 'users'
When method get
Then status 200

* def first = response[0]

Given path 'users'
And retry until response[0].id == first.id
When method get
Then status 200

Given path 'users'
And retry until response[*].id == first.id
When method get
Then status 200

The first retry works, but the second one generates an error because [*] cannot be used with the retry command. But how can I check that first.id is present in at least one of the objects in the response array, while using retry and not a javascript function?

Adrien
  • 1,080
  • 4
  • 14

1 Answers1

1

Yes the expression has to be pure JS and you can't mix JsonPath. But since you can define and re-use functions, here is one way to do it:

* def response = [{ id: 1 }, { id: 2 }, { id: 3 }]
* def hasId = function(id){ return karate.filter(response, function(x){ return x.id == id }).length != 0 }
* assert hasId(1)
* assert !hasId(9)

So now this should work:

And retry until hasId(first.id)

Note that there is a rarely used karate.match() that may also work, but it doesn't support contains directly unless you use the short-cuts.

EDIT: karate.match() has been improved: https://stackoverflow.com/a/50350442/143475

Peter Thomas
  • 54,465
  • 21
  • 84
  • 248
  • 1
    Thank you, it does work on the example, I'll just adapt it to my real case, but this shouldn't be a problem. – Adrien Jan 02 '19 at 15:23
  • 1
    @Adrien you are welcome. note that if you define the function before the `response` is "defined" you may have to pass that as the arg / or use `karate.get('response')` – Peter Thomas Jan 02 '19 at 15:27