Ask a Question

Script Assertion Query - Verify a repeating .json attribute has specific value domain?

SOLVED
richie
Community Hero

Script Assertion Query - Verify a repeating .json attribute has specific value domain?

Hey!

 

@rao gave me a script assertion that asserts that a repeating .json attribute has a specific value via a GET REST request

assert context.response, 'Request parameter is correct'
def json = new groovy.json.JsonSlurper().parseText(context.response)
assert json.data.Name.every{'Geographical Indication' == it}
//assert json.data.Name.every{context.expand('${REST Request#Name}') == it}

I need to extend this script assertion so that it verifies that this repeating 'Name' attribute has a specific value domain - e.g. Geographical Indication', 'Protected Designation of Origin', 'Protected Geographical Indication', 'Traditional Speciality Guaranteed'

 

I tried updating the script assertion as follows:

assert context.response, 'Request parameter is correct'
def json = new groovy.json.JsonSlurper().parseText(context.response)
assert json.data.Name.every{['Geographical Indication', 'Protected Designation of Origin', 'Protected Geographical Indication', 'Traditional Speciality Guaranteed'] == it}

When I execute the script assertion - I get the following failure response:

 

assert json.data.Name.every{['Geographical Indication', 'Protected Designation of Origin', 'Protected Geographical Indication', 'Traditional Speciality Guaranteed'] == it}
| | | | | | | false | | [Geographical Indication, Protected Designation of Origin, Protected Geographical Indication, Traditional Speciality Guaranteed] | .............

I've adding a .toString() method to the assertion value

assert json.data.Name.every{['Geographical Indication', 'Protected Designation of Origin', 'Protected Geographical Indication', 'Traditional Speciality Guaranteed'].toString() == it}

but that didn't work.  

 

Can anyone advise how to get this working?  Am I mis-using the 'every' method here?

 

This time I remembered!  🙂   I've attached the .json response I'm trying to get the assertion working on! 🙂

 

Thanks to all!

 

Cheers,

 

richie

if this helped answer the post, could you please mark it as 'solved'? Also if you consider whether the title of your post is relevant? Perhaps if the post is solved, it might make sense to update the Subject header field of the post to something more descriptive? This will help people when searching for problems. Ta
7 REPLIES 7
Lucian
Community Hero

I will try to help you. Can you please post a response example so that I can look into it?



If my answer helped please click on the 'Accept as Solution' button.
richie
Community Hero

Hey @Lucian 

 

.json  response is as below: - thank you

 

{
   "header" : {
      "success" : true,
      "message" : ""
   },
   "meta" : {
      "count" : 4,
      "total" : 4,
      "type" : "award-classification",
      "pages" : {
         "next" : null,
         "previous" : null
      },
      "fields" : [
         "ID",
         "VersionNumber",
         "Name",
         "Code",
         "AwardClassificationDescription",
         "EffectiveFrom",
         "EffectiveTo",
         "State"
      ],
      "custodian" : "DDTS",
      "last_updated" : "2019-02-12T18:00:00"
   },
   "data" : [
      {
         "ID" : "89501561-12cf-4009-8a2b-ee62bc21041a",
         "Links" : {
            "href" : "https://ref-tst.azure.defra.cloud/api/1/geographical-indication/award-classification/89501561-12cf-4009-8a2b-ee62bc21041a",
            "rel" : "self",
            "method" : "GET"
         },
         "VersionNumber" : 1,
         "Name" : "Geographical Indication",
         "Code" : "GI",
         "AwardClassificationDescription" : "product is produced, processed or prepared in the geographical area you want to associate it with.",
         "EffectiveFrom" : "2019-02-08T00:00:00.0000000",
         "EffectiveTo" : null,
         "State" : "Active"
      },
      {
         "ID" : "07eeb9ee-3ab4-4dd9-a14e-faa8c9b86508",
         "Links" : {
            "href" : "https://ref-tst.azure.defra.cloud/api/1/geographical-indication/award-classification/07eeb9ee-3ab4-4dd9-a14e-faa8c9b86508",
            "rel" : "self",
            "method" : "GET"
         },
         "VersionNumber" : 1,
         "Name" : "Protected Designation of Origin",
         "Code" : "PDO",
         "AwardClassificationDescription" : "product must be produced, processed and prepared in one area and have distinct characteristics from this area.\t",
         "EffectiveFrom" : "2019-02-08T00:00:00.0000000",
         "EffectiveTo" : null,
         "State" : "Active"
      },
      {
         "ID" : "b9d48e13-5d39-4997-ad72-5ddb40785265",
         "Links" : {
            "href" : "https://ref-tst.azure.defra.cloud/api/1/geographical-indication/award-classification/b9d48e13-5d39-4997-ad72-5ddb40785265",
            "rel" : "self",
            "method" : "GET"
         },
         "VersionNumber" : 1,
         "Name" : "Protected Geographical Indication",
         "Code" : "PGI",
         "AwardClassificationDescription" : "product is produced, processed or prepared in the geographical area you want to associate it with.",
         "EffectiveFrom" : "2019-02-08T00:00:00.0000000",
         "EffectiveTo" : null,
         "State" : "Active"
      },
      {
         "ID" : "c4b4cb4c-bbe4-4a55-9f63-d414fd71c7e9",
         "Links" : {
            "href" : "https://ref-tst.azure.defra.cloud/api/1/geographical-indication/award-classification/c4b4cb4c-bbe4-4a55-9f63-d414fd71c7e9",
            "rel" : "self",
            "method" : "GET"
         },
         "VersionNumber" : 1,
         "Name" : "Traditional Speciality Guaranteed",
         "Code" : "TSG",
         "AwardClassificationDescription" : "product must have a traditional name and characteristics that distinguish it from other similar products.",
         "EffectiveFrom" : "2019-02-08T00:00:00.0000000",
         "EffectiveTo" : null,
         "State" : "Active"
      }
   ]
}

Cheers,

 

richie

if this helped answer the post, could you please mark it as 'solved'? Also if you consider whether the title of your post is relevant? Perhaps if the post is solved, it might make sense to update the Subject header field of the post to something more descriptive? This will help people when searching for problems. Ta
New2API
Frequent Contributor

@richie, following script might work. though I have hardcoded Names in "expected" list.

import net.sf.*
import net.sf.json.*
import net.sf.json.groovy.*
import groovy.json.JsonSlurper

def json = new groovy.json.JsonSlurper().parseText(context.response)

def expected = ['Geographical Indication', 'Protected Designation of Origin', 'Protected Geographical Indication', 'Traditional Speciality Guaranteed']
def actual = []

json.data.Name.each{
	                actual = actual+it
	
}

assert expected == actual   
nmrao
Community Hero

@richie 

How about this?

 

def domainList = ['Geographical Indication', 'Protected Designation of Origin', 'Protected Geographical Indication', 'Traditional Speciality Guaranteed']
assert json.data.Name.every{ it in domainList }


Regards,
Rao.
richie
Community Hero

Hey @nmrao / @New2API 

 

lads - thanks so much - both scripts do exactly what I need!

 

nice one

 

richie

if this helped answer the post, could you please mark it as 'solved'? Also if you consider whether the title of your post is relevant? Perhaps if the post is solved, it might make sense to update the Subject header field of the post to something more descriptive? This will help people when searching for problems. Ta
richie
Community Hero

Hey guys,

 

I thought the code snippets you'd provided would satisfy - but I wasn't specific enough in my original post it would seem.

 

When I originally said that i needed to assert that a specific attribute had a specific value domain for repeating records within a .json response this was fine if there were only 7 records and the following script assertion works great!

def json = new groovy.json.JsonSlurper().parseText(context.response)

def domainList = ['Food-PGI', 'Food-PDO', 'Food-TSG', 'Wines-PGI', 'Wines-PDO', 'Aromatised Wines-GI', 'Spirits-GI']
assert json.data.Name.every{ it in domainList }

HOWEVER - if I have 1000s of records the above script assertion won't work - because I need to supply the values in the array in the same order in which they appear in the returned .json response.

 

when I said a specific value domain I meant like a distinct SQL query - so if 900 records come back and they have the Name attribute is populated with 1 of 7 possible values - this was what I was hoping for.

 

The problem is that currently - if I submit my GET request on certain datasets - I have thousands of records and I would need  to add in the values in the correct sequence.

 

Is there any way to alter the above so it asserts like a distinct SQL query (just asserts that the Name attribute in the 1000s of records is populated with 1 of 7 possible values)???

 

Thanks guys - I sorry for having to come back on this, especially after I marked it resolved - I only noticed when I started hitting large datasets that this didnt work.

 

richie

if this helped answer the post, could you please mark it as 'solved'? Also if you consider whether the title of your post is relevant? Perhaps if the post is solved, it might make sense to update the Subject header field of the post to something more descriptive? This will help people when searching for problems. Ta
New2API
Frequent Contributor

@richie, how about using unique()

import net.sf.*
import net.sf.json.*
import net.sf.json.groovy.*
import groovy.json.JsonSlurper

def json = new groovy.json.JsonSlurper().parseText(context.response)

def expected = ['Geographical Indication', 'Protected Designation of Origin', 'Protected Geographical Indication', 'Traditional Speciality Guaranteed']
def actual = []

json.data.Name.each{
	                actual = actual+it
	
}

def acutalUnique = []
acutalUnique  = actual.unique() //creates a new array or list with unique values

assert expected == acutalUnique  
cancel
Showing results for 
Search instead for 
Did you mean: