I am trying to use a match contains to verify my schema response and data types and sometimes it returns a null and sometimes it will return a string, as an example. I am trying the following but I am getting the assertion failed because it did not evaluate to true.
I am trying the following:
* match each $response.data.Results contains """ { "providerID": '#number', "firstName": "#? _ == '#string' || _ == '#null'", "lastName": '#string', "mI": "#? _ == '#string' || _ == '#null'", "title": '#string', "name": '#string', "nameLFMT": '#string', "status": '#string', "specialties": '#array', "locations": '#array', "institutions": '#array', "acceptNewPatient": '#string', "imageUri": '#string', "nearestLatitude": '#number', "nearestLongitude": '#number' } """
The data returned for “firstName” for example is “firstName”:null,
Prior to the match each I am sending this:
Scenario: SearchResults #Verify 200 response status returned Given text query = """ { Results: getSearchResults(searchLatitude:"48.942833", searchLongitude: "-119.984549", providerType: "Primary Care Physicians", sortBy: "distance", maxDistance:"600", skip: 0, take: 10) { providerID firstName lastName mI title name nameLFMT status specialties locations institutions acceptNewPatient imageUri nearestLatitude nearestLongitude } } """ And request { query: '#(query)' } When method post Then status 200
I am not defining the schema, I have yet to figure out how to do this so I am not sure if that is my issue. I know this is probably how I should do this but I’m still learning.
Thanks for any help.
Advertisement
Answer
Ok I see one problem here:
"firstName": "#? _ == '#string' || _ == '#null'"
That’s not going to work. The part that follows the #?
has to be a valid JavaScript expression. This may be hard to understand if you are not familiar with JS but #string
and friends are specific to the Karate match
keyword and not something that works in JavaScript.
So what the above line is doing is checking if the value of firstName
is equal to the literal string #string
.
Fortunately Karate has a solution: (refer doc for ‘fuzzy matching‘):
"firstName": "##string"
Which is a convenience, the double ##
means ‘optional’ that will match for both a string or null
.
EDIT: for advanced cases, please read this: https://stackoverflow.com/a/50350442/143475