cancel
Showing results for 
Search instead for 
Did you mean: 

How to pick minimum value of an attribute from soap response and pick next node value based on it

SOLVED
Occasional Contributor

How to pick minimum value of an attribute from soap response and pick next node value based on it

From below response I am trying to pick minimum value of AmountAfterTax and also value of corresponding HotelCode and ChainCode.

 

Response XML - 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <SOAP-ENV:Header xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"/>
   <soap:Body>
      <ns2:OTA_HotelAvailRS AltLangID="en" EchoToken="1234" PrimaryLangID="en" RetransmissionIndicator="false" Target="Test">
         <ns2:Success/>
         <ns2:RoomStays>
            <ns2:RoomStay>
               <ns2:RoomRates>
                  <ns2:RoomRate>
                     <ns2:Rates>
                        <ns2:Rate RateMode="1">
                           <ns2:Base AmountAfterTax="193.81" AmountBeforeTax="169.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                        <ns2:Rate RateMode="2">
                           <ns2:Base AmountAfterTax="296.43" AmountBeforeTax="259.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                     </ns2:Rates>
                  </ns2:RoomRate>
               </ns2:RoomRates>
               <ns2:BasicPropertyInfo BrandCode="BEST" ChainCode="ABC" HotelCode="1234"/>
               <ns2:TPA_Extensions>
                  <ns2:ExchangeRate Percent="1"/>
               </ns2:TPA_Extensions>
            </ns2:RoomStay>
            <ns2:RoomStay>
               <ns2:RoomRates>
                  <ns2:RoomRate>
                     <ns2:Rates>
                        <ns2:Rate RateMode="1">
                           <ns2:Base AmountAfterTax="296.42" AmountBeforeTax="268.20" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                        <ns2:Rate RateMode="2">
                           <ns2:Base AmountAfterTax="373.56" AmountBeforeTax="338.00" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                     </ns2:Rates>
                  </ns2:RoomRate>
               </ns2:RoomRates>
               <ns2:BasicPropertyInfo BrandCode="PLUS" ChainCode="ABC" HotelCode="3456"/>
               <ns2:TPA_Extensions>
                  <ns2:ExchangeRate Percent="1"/>
               </ns2:TPA_Extensions>
            </ns2:RoomStay>
            <ns2:RoomStay>
               <ns2:RoomRates>
                  <ns2:RoomRate>
                     <ns2:Rates>
                        <ns2:Rate RateMode="1">
                           <ns2:Base AmountAfterTax="213.61" AmountBeforeTax="191.23" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                        <ns2:Rate RateMode="2">
                           <ns2:Base AmountAfterTax="452.36" AmountBeforeTax="404.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                     </ns2:Rates>
                  </ns2:RoomRate>
               </ns2:RoomRates>
               <ns2:BasicPropertyInfo BrandCode="BEST" ChainCode="ABC" HotelCode="03154"/>
               <ns2:TPA_Extensions>
                  <ns2:ExchangeRate Percent="1"/>
               </ns2:TPA_Extensions>
            </ns2:RoomStay>
            <ns2:RoomStay>
               <ns2:RoomRates>
                  <ns2:RoomRate>
                     <ns2:Rates>
                        <ns2:Rate RateMode="1">
                           <ns2:Base AmountAfterTax="410.08" AmountBeforeTax="359.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                        <ns2:Rate RateMode="2">
                           <ns2:Base AmountAfterTax="797.42" AmountBeforeTax="699.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                     </ns2:Rates>
                  </ns2:RoomRate>
               </ns2:RoomRates>
               <ns2:BasicPropertyInfo BrandCode="PLUS" ChainCode="ABC" HotelCode="03147"/>
               <ns2:TPA_Extensions>
                  <ns2:ExchangeRate Percent="1"/>
               </ns2:TPA_Extensions>
            </ns2:RoomStay>
            <ns2:RoomStay>
               <ns2:RoomRates>
                  <ns2:RoomRate>
                     <ns2:Rates>
                        <ns2:Rate RateMode="1">
                           <ns2:Base AmountAfterTax="368.42" AmountBeforeTax="322.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                        <ns2:Rate RateMode="2">
                           <ns2:Base AmountAfterTax="479.08" AmountBeforeTax="419.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                     </ns2:Rates>
                  </ns2:RoomRate>
               </ns2:RoomRates>
               <ns2:BasicPropertyInfo BrandCode="BEST" ChainCode="ABC" HotelCode="03133"/>
               <ns2:TPA_Extensions>
                  <ns2:ExchangeRate Percent="1"/>
               </ns2:TPA_Extensions>
            </ns2:RoomStay>
            <ns2:RoomStay>
               <ns2:RoomRates>
                  <ns2:RoomRate>
                     <ns2:Rates>
                        <ns2:Rate RateMode="1">
                           <ns2:Base AmountAfterTax="246.86" AmountBeforeTax="219.30" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                        <ns2:Rate RateMode="2">
                           <ns2:Base AmountAfterTax="403.00" AmountBeforeTax="358.00" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                     </ns2:Rates>
                  </ns2:RoomRate>
               </ns2:RoomRates>
               <ns2:BasicPropertyInfo BrandCode="BEST" ChainCode="ABC" HotelCode="03092"/>
               <ns2:TPA_Extensions>
                  <ns2:ExchangeRate Percent="1"/>
               </ns2:TPA_Extensions>
            </ns2:RoomStay>
            <ns2:RoomStay>
               <ns2:RoomRates>
                  <ns2:RoomRate>
                     <ns2:Rates>
                        <ns2:Rate RateMode="1">
                           <ns2:Base AmountAfterTax="144.06" AmountBeforeTax="127.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                        <ns2:Rate RateMode="2">
                           <ns2:Base AmountAfterTax="236.38" AmountBeforeTax="209.98" CurrencyCode="USD" DecimalPlaces="2"/>
                        </ns2:Rate>
                     </ns2:Rates>
                  </ns2:RoomRate>
               </ns2:RoomRates>
               <ns2:BasicPropertyInfo BrandCode="BEST" ChainCode="ABC" HotelCode="03062"/>
               <ns2:TPA_Extensions>
                  <ns2:ExchangeRate Percent="1"/>
               </ns2:TPA_Extensions>
            </ns2:RoomStay>
         </ns2:RoomStays>
      </ns2:OTA_HotelAvailRS>
   </soap:Body>
</soap:Envelope>

Below is the code by which I am able to get all the values for AmountAfterTax but sort method is not working and I am unable to fetch the corresponding HotelCode and ChainCode.

 

import groovy.xml.*;

def response = testRunner.testCase.getTestStepByName("AreaAvail_2011B").getProperty("Response").getValue()

def parsedXml = new XmlSlurper().parseText(response)
def amountAfterTax = parsedXml.'**'.findAll {'Base' == it.name()}*.@AmountAfterTax 

Arrays.sort(amountAfterTax);
def minimumAmount = amountAfterTax[0]

Thanks in advance for your suggestions.

1 ACCEPTED SOLUTION

Accepted Solutions
Community Hero

Re: How to pick minimum value of an attribute from soap response and pick next node value based on i

//Using this expectedStayInfo  just for testing
def expectedStayInfo = [AmountAfterTax: 144.06, HotelCode: '03062', ChainCode: 'ABC' ]

def xml = new XmlSlurper().parseText(response)
def stays = xml.'**'.findAll {it.name() == 'RoomStay'}
def actualStayInfo = [AmountAfterTax: 0, HotelCode: null, ChainCode: null]

def updateActualStayInfo = { node, rate  -> 
  def isUpdate = false
  if ((0 == actualStayInfo.AmountAfterTax) || (actualStayInfo.AmountAfterTax > rate)) { 
    isUpdate = true
  }
  if (isUpdate) {
    def info = node.'**'.find{'BasicPropertyInfo' == it.name()}
    actualStayInfo.AmountAfterTax = rate
    actualStayInfo.HotelCode = info.@HotelCode.text()
    actualStayInfo.ChainCode = info.@ChainCode.text()
  }
}
stays.each { stay -> def tempMin = stay.'**'.findAll{it.name() == 'Base'}*.@AmountAfterTax.collect{it.toBigDecimal()}.min() updateActualStayInfo(stay, tempMin) } //test if the actual value of xml is matching assert actualStayInfo == expectedStayInfo


Regards,
Rao.
6 REPLIES 6
Community Hero

Re: How to pick minimum value of an attribute from soap response and pick next node value based on i

What is the expected output from above response?

 

Becuase, in each RoomStay, there are multiple values again.



Regards,
Rao.
Occasional Contributor

Re: How to pick minimum value of an attribute from soap response and pick next node value based on i

So basically I am trying to find the HotelCode and ChainCode for which minimum price is available among all the available options.

 

 

Community Hero

Re: How to pick minimum value of an attribute from soap response and pick next node value based on i

Understand. Just for clarification, can you please put the numbers / data that is expected?


Regards,
Rao.
Occasional Contributor

Re: How to pick minimum value of an attribute from soap response and pick next node value based on i

sure, from the posted response minimum value for AmountAfterTax is 144.06 and corresponding to that HotelCode is 03062 and ChainCode is ABC. 

 

Thank you in advance for looking into it.

Community Hero

Re: How to pick minimum value of an attribute from soap response and pick next node value based on i

//Using this expectedStayInfo  just for testing
def expectedStayInfo = [AmountAfterTax: 144.06, HotelCode: '03062', ChainCode: 'ABC' ]

def xml = new XmlSlurper().parseText(response)
def stays = xml.'**'.findAll {it.name() == 'RoomStay'}
def actualStayInfo = [AmountAfterTax: 0, HotelCode: null, ChainCode: null]

def updateActualStayInfo = { node, rate  -> 
  def isUpdate = false
  if ((0 == actualStayInfo.AmountAfterTax) || (actualStayInfo.AmountAfterTax > rate)) { 
    isUpdate = true
  }
  if (isUpdate) {
    def info = node.'**'.find{'BasicPropertyInfo' == it.name()}
    actualStayInfo.AmountAfterTax = rate
    actualStayInfo.HotelCode = info.@HotelCode.text()
    actualStayInfo.ChainCode = info.@ChainCode.text()
  }
}
stays.each { stay -> def tempMin = stay.'**'.findAll{it.name() == 'Base'}*.@AmountAfterTax.collect{it.toBigDecimal()}.min() updateActualStayInfo(stay, tempMin) } //test if the actual value of xml is matching assert actualStayInfo == expectedStayInfo


Regards,
Rao.
Highlighted
Occasional Contributor

Re: How to pick minimum value of an attribute from soap response and pick next node value based on i

Thank you @nmrao this sovles my issue.

New Here?
Join us and watch the welcome video:
API Testing Mistake #2
APITestingMistake#2
Top Kudoed Authors