Dixie
Dixie

Reputation: 81

Cannot use "==" and "contains" in same line of scenario using conditional logic in Karate

This is a follow up of a question noted here

Lets says our implemented server v1 and v2 response looks as follows

v1Response = { id: "1", name: "awesome" }
v2Response = { id: "2", name: "awesome", value: "karate" }

Similarly we define the client schema for v1 and v2 like as follows

v1Schema = { id: "#string", name: "#string }
v2Schema = { id: "#string", name: "#string, value: "#string" }

We implement schema validation in our generic scenario as follows. We can easily set the "response" with either v1Response/v2Response AND "schema" with either v1Schema/v2Schema depending on our the environment.

* match response == schema

Above generic script works perfectly fine as long as we are testing v1 server against v1 client / v2 server against v2 client. However we cannot re-use the same scenario when we want to test backward compatibility for example v2 server against v1 client. In this case

* match response (actually v2Response) == schema (actually v1Schema) <--- will fail

So in order to make it work and do backward compatibility testing, I also wanted to use karate "contains" feature like

* match response (actually v2Response) contains schema (actually v1Schema) <--- will pass

However in the quest to keep my scenarios generic it is currently not possible to do either

  1. Use both ==/contains in the same line of script like as follows
    • serverVersion == clientVersion ? (match response == schema) : (match response contains schema)

OR

  1. Using some flag as follows

    • match response SOMEFLAG schema

whereas SOMEFLAG can be set to either "==" or "contains" in karate-config.js depending on environment we are testing.

EDIT

From the above example, all I want is to test following cases that should pass

* match v1Response == v1Schema
* match v2Response == v2Schema 
* match v2Response contains v1Schema

using a generic line as following

* match response == schema <--- can it possibly be solved using above suggested solutions ?

Upvotes: 2

Views: 393

Answers (1)

Peter Thomas
Peter Thomas

Reputation: 58058

For some reason you feel that hacking the match clause is the only way to solve this problem. Please keep an open mind and, here you go:

* def schemas =
"""
{
  v1: { id: "#string", name: "#string" },
  v2: { id: "#string", name: "#string", value: "#string" }
}
"""

* def env = 'v1'
* def response = { id: "1", name: "awesome" }
* match response == schemas[env]

* def env = 'v2'
* def response = { id: "2", name: "awesome", value: "karate" }
* match response == schemas[env]

* def response = { id: "1", name: "awesome" }
* match response == karate.filterKeys(schemas[env], response)

The last line is as generic as you can get.

Upvotes: 3

Related Questions