Search code examples
gatlingscala-gatling

Helping me understand session api Gatling


I am new to gatling I am trying to loop on json response, find the country code that I am looking for and take the id coressponding the that coutry code. Sample algorithm: list.foreach( value => { if (value.coutrycode == "PL") then store value.id })

on Gatling:

def getOffer() = {
          exec(
                http("GET /offer")
                  .get("/offer")
                  .check(status.is(Constant.httpOk))
                  .check((bodyString.exists),
                    jsonPath("$[*]").ofType[Map[String,Any]].findAll.saveAs("offerList")))
                      .foreach("${offerList}", "item"){
                        exec(session => {
                          val itemMap = session("item").as[Map[String,Any]]
                          val countryCodeId = itemMap("countryCode")
                          println("****" + countryCodeId)
                          // => print all the country code on the list 
                          if (countryCodeId =="PL"){ // if statement condition
                             println("*************"+ itemMap("offerd")); // print the id eg : "23"
                             session.set("offerId", itemMap("offerId")); // set the id on the session
                          }
                          println("$$$$$$$$$$$$$$" + session("offerId")) // verify that th session contains the offerId but is not 
                          session
                        })
                      }
        }

When I try to print the session("offerId"), it's print "item" and not the offerId. I looked on the documentation but I didn't understand the behaviour. Could you please explain it to me ?


Solution

  • It's all in the documentation.

    Session instances are immutable!

    Why is that so? Because Sessions are messages that are dealt with in a multi-threaded concurrent way, so immutability is the best way to deal with state without relying on synchronization and blocking.

    A very common pitfall is to forget that set and setAll actually return new instances.

    val session: Session = ???
    
    // wrong usage
    session.set("foo", "FOO") // wrong: the result of this set call is just discarded
    session.set("bar", "BAR")
    
    // proper usage
    session.set("foo", "FOO").set("bar", "BAR")
    

    So what you want is:

    val newSession =
      if (countryCodeId =="PL"){ // if statement condition
        println("*************"+ itemMap("offerd")); // print the id eg : "23"
        session.set("offerId", itemMap("offerId")); // set the id on the session
      } else {
        session
      }
    // verify that the session contains the offerId
    println("$$$$$$$$$$$$$$" + newSession("offerId").as[String]) 
    newSession