groovysoapuiready-api

Groovy script to verify response data is in ascending order


I have a SOAP Response for which need to use Groovy script to assert if the date parameter in the row xml child are coming in ascending order.

xml response

<tree>
 <row>
  <id>123<id>
  <date>20220501</date>
 </row>
 <row>
  <id>242<id>
  <date>20220502</date>
 </row>
 <row>
  <id>125<id>
  <date>20220502</date>
 </row>
</tree>

Please help me with the groovy scripting approach/ script for the same, I am a beginner here.


Solution

  • simple sax parsing solution with date (as int) comparison:

    import javax.xml.parsers.SAXParserFactory
    import javax.xml.streams.*
    import org.xml.sax.*
    import org.xml.sax.helpers.DefaultHandler
    
    def xml = '''
    <tree>
     <row>
      <id>123</id>
      <date>20220501</date>
     </row>
     <row>
      <id>242</id>
      <date>20220502</date>
     </row>
     <row>
      <id>125</id>
      <date>20220502</date>
     </row>
    </tree>
    '''
    
     
     class MyHandler extends DefaultHandler {
         
        int lastDate = -1
        def parsingDate = false
        def ordered = true
     
     
        void startElement(String namespace, String localname, String qname, Attributes atts){
            // enters into <date> tag
            parsingDate = (qname == 'date')
        }
        
        void characters(char[] ch, int start, int length){
            if (parsingDate ){
                // get date as int
                def date = new String(ch).substring(start,start+length) as int
                // comparison
                ordered &= (date >= lastDate )
                lastDate = date
                // else may be throw an exception
            }
        }
    
       
        void endElement(String uri, String localName, String qName) {
            // exit from date tag
            parsingDate = false
        }
    
    }
     
    def handler = new MyHandler()
    def factory  = SAXParserFactory.newInstance()
    def reader = factory.newSAXParser().XMLReader
    reader.contentHandler = handler
     
    reader.parse(new InputSource(new ByteArrayInputStream(xml.bytes)))
    
    println handler.ordered