1
votes

I am using SoapUI Pro to test web services used for creating postal despatch shipments.

I am using a groovy script to validate my web service requests. If I am expecting the request to succeed I look for a value of ‘Allocated’ in the ‘status’ field. If I am expecting the request to fail I look for the correct error code and errorDescription in the integration footer.

Sometimes a valid request will have a warning message (e.g. to inform user that field data is too long and has been truncated). I also want to validate these warning messages as well.

I specify the element path that I want to validate in my data source file and then pass it to my groovy script that does the validation.

The groovy script retrieves the value in the element path and assigns it to a variable actualReturn1 using ..

actualReturn1  = holder.getNodeValue(testElementOne);

where testElementOne could be either

//NS1:completedShipmentInfo/NS1:status/status/statusCode/code

OR

//NS1:createShipmentResponse/NS1:integrationFooter/errors/error/errorCode

The first path is valid and correctly assigns the value of this status field to actualReturn1.

But the second path does not appear to be valid and assigns null to actualReturn1.

Below are part of my 2 response files the elements I’m trying to extract data from.

Response with status element that is extracted successfully..

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:createShipmentResponse xmlns:NS1="http://www.royalmailgroup.com/api/ship/V1">
         <NS1:integrationHeader>
            <dateTime xmlns="http://www.royalmailgroup.com/integration/core/V1">2013-12-02T17:06:11</dateTime>
            <version xmlns="http://www.royalmailgroup.com/integration/core/V1">1</version>
            <identification xmlns="http://www.royalmailgroup.com/integration/core/V1">
               <applicationId>111111113</applicationId>
               <transactionId>420642961</transactionId>
            </identification>
         </NS1:integrationHeader>
         <NS1:completedShipmentInfo>
            <NS1:status>
               <status>
                  <statusCode>
                     <code>Allocated</code>
                  </statusCode>
               </status>

Response with errorCode that can not be extracted…

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:createShipmentResponse xmlns:NS1="http://www.royalmailgroup.com/api/ship/V1">
         <NS1:integrationHeader>
            <dateTime xmlns="http://www.royalmailgroup.com/integration/core/V1">2013-12-02T17:06:13</dateTime>
            <version xmlns="http://www.royalmailgroup.com/integration/core/V1">1</version>
            <identification xmlns="http://www.royalmailgroup.com/integration/core/V1">
               <applicationId>111111113</applicationId>
               <transactionId>420642961</transactionId>
            </identification>
         </NS1:integrationHeader>
         <NS1:integrationFooter>
            <errors xmlns="http://www.royalmailgroup.com/integration/core/V1">
               <error>
                  <errorCode>E1101</errorCode>
                  <errorDescription>Name is a required field</errorDescription>
               </error>
            </errors>

Could someone tell me why this isn't working for the second response? If I have warning messages in a valid response then I'm also not able to extract the value. Is it because this is in the integrationFooter?

1

1 Answers

0
votes

Happened to see this now, so adding the answer.

In the 2nd case, it was not working for you because of the namespace issue.

The element, errors is using default namespace and is different from its parent element integrationFooter. And in your xpath, no namespace was referred to element errors and its child elements.

Here is the script that works for 2nd case:

def xml = '''
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <NS1:createShipmentResponse xmlns:NS1="http://www.royalmailgroup.com/api/ship/V1">
         <NS1:integrationHeader>
            <dateTime xmlns="http://www.royalmailgroup.com/integration/core/V1">2013-12-02T17:06:13</dateTime>
            <version xmlns="http://www.royalmailgroup.com/integration/core/V1">1</version>
            <identification xmlns="http://www.royalmailgroup.com/integration/core/V1">
               <applicationId>111111113</applicationId>
               <transactionId>420642961</transactionId>
            </identification>
         </NS1:integrationHeader>
         <NS1:integrationFooter>
            <errors xmlns="http://www.royalmailgroup.com/integration/core/V1">
               <error>
                  <errorCode>E1101</errorCode>
                  <errorDescription>Name is a required field</errorDescription>
               </error>
            </errors>
         </NS1:integrationFooter>
      </NS1:createShipmentResponse>
   </soapenv:Body>
</soapenv:Envelope>'''
def holder = new com.eviware.soapui.support.XmlHolder( xml )
holder.declareNamespace('a','http://www.royalmailgroup.com/api/ship/V1')
holder.declareNamespace('b','http://www.royalmailgroup.com/integration/core/V1' )
def errorCode = holder.getNodeValue( "//a:integrationFooter/b:errors/b:error/b:errorCode" )
assert errorCode == 'E1101'