У меня есть метод контроллера Scalatra, который читает и устанавливает некоторые файлы cookie. Это выглядит примерно так:
get("/cookietest") {
cookies.get("testcookie") match {
case Some(value) =>
cookies.update("testcookie",s"pong:$value")
cookies.set("testcookie_set", "0")
Ok(value)
case None =>
BadRequest("No cookie")
}
}
Кажется, я не могу найти способ отправить файлы cookie с запросом в тестовом методе:
// I want to do something like this:
test("GET / on DownloadsServlet should return status 200"){
request.setCookies("testcookie", "wtf")
get("/cookietest"){
cookies("testcookie") should equal ("pong:wtf")
cookies("testcookie_set") should equal ("0")
status should equal (HttpStatus.OK_200)
}
}
Однако в области применения request или cookies нет.





Метод get() в тесте может принимать до трех параметров: uri, params и headers. Итак, можно передать Map.empty в params, а затем передать карту, содержащую Map("Cookie" -> cookiesAsAString).
Я закончил этот тест и несколько вспомогательных методов:
test("GET /cookietest on DownloadsServlet should return status 200 when a cookie is supplied"){
get("/cookietest", params = Map.empty, headers = cookieHeaderWith("testcookie" -> "what")){
status should equal (HttpStatus.OK_200)
body should equal ("what")
val cookies = getCookiesFrom(response)
cookies.head.getName should be("testcookie")
cookies.head.getValue should be("pong:what")
}
}
/**
* Extracts cookies from a test response
*
* @param response test response
* @return a collection of HttpCookies or an empty iterable if the header was missing
*/
def getCookiesFrom(response: ClientResponse): Iterable[HttpCookie] = {
val SetCookieHeader = "Set-Cookie"
Option(response.getHeader(SetCookieHeader))
.map(HttpCookie.parse(_).asScala)
.getOrElse(Iterable.empty)
}
/**
* Helper to create a headers map with the cookies specified. Merge with another map for more headers.
*
* This allows only basic cookies, no expiry or domain set.
*
* @param cookies key-value pairs
* @return a map suitable for passing to a get() or post() Scalatra test method
*/
def cookieHeaderWith(cookies: Map[String, String]): Map[String, String] = {
val asHttpCookies = cookies.map { case (k, v) => new HttpCookie(k, v) }
val headerValue = asHttpCookies.mkString("; ")
Map("Cookie" -> headerValue)
}
/**
* Syntatically nicer function for cookie header creation:
*
* cookieHeaderWith("testcookie" -> "what")
*
* instead of
* cookieHeaderWith(Map("testcookie" -> "what"))
*
* @param cookies
* @return
*/
def cookieHeaderWith(cookies: (String, String)*): Map[String, String] = {
cookieHeaderWith(cookies.toMap)
}