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

Leave a Reply