I'm trying to validate some properties of my response as shown in the rest assured tutorial.
The problem is that, when testing properties inside an array, I can verify, as in the example, that they appear, but not that they're matched to other properties of the element as they should.
To clarify, let's say I have the response from the tutorial (added "prize")
{
"lotto":{
"lottoId":5,
"winning-numbers":[2,45,34,23,7,5,3],
"winners":[{
"winnerId":23,
"prize":5000,
"numbers":[2,45,34,23,3,5]
},{
"winnerId":54,
"prize":100000,
"numbers":[52,3,12,11,18,22]
}]
}
}
I can validate that the winnerIds as 23, and 54
expect().
body("lotto.lottoId", equalTo(5)).
body("lotto.winners.winnderId", hasItems(23, 54)).
when().
get("/lotto");
and I could validate that the prizes are 500 and 100000, but I can't validate that the winnerId=23 has a prize=500 and the winnerId=54 a prize=100000. The response would show the winnerId=23 with a prize=100000 and the tests would pass.
I can't use contains() because the elements in the array can come in any order, so I need to user containsInAnyOrder().
As far as I know, Rest-Assured only allows to verify straight forward value verification. For conditional verification, you have to use jsonpath instead:
$.lotto.winners.[?(@.winnerId==23)].prize
Above jsonpath searches for winners
array under lotto
and selects the array item which has winnerId==23
and then retrieves the prize;
expect().
body("$.lotto.winners.[?(@.winnerId==23)].prize", equalTo(5000)).
when().
get("/lotto");
There are other posts in SO that you can referenc are here and here
Try the expression in this link
JsonPath expression syntax can be found here.