Forum Discussion

ngoyal's avatar
ngoyal
Occasional Contributor
6 years ago

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.

  • //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
  • nmrao's avatar
    nmrao
    Champion Level 3

    What is the expected output from above response?

     

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

    • ngoyal's avatar
      ngoyal
      Occasional Contributor

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

       

       

      • nmrao's avatar
        nmrao
        Champion Level 3
        Understand. Just for clarification, can you please put the numbers / data that is expected?