tests/testthat/test-session-cookie.R

headers <- list(
  Content_Type = 'application/json',
  Date = 'Wed, 21 Oct 2015 07:28:00 GMT',
  Accept = 'application/json, application/xml; q=0.5, text/*; q=0.3',
  Accept_Encoding = 'gzip, br',
  Cookie = 'id=Thomas; key=123',
  X_Forwarded_For = '500.0.0.0, 400.0.0.0',
  X_Forwarded_Host = 'www.example.com:80',
  X_Forwarded_Proto = 'https',
  X_Custom_Message = '"Testing string literals, with comma", no-literal'
)
body <- '{"name":["Thomas Lin Pedersen"],"age":[31],"homepage":["www.data-imaginist.com","www.github.com/thomasp85"]}'
rook <- fiery::fake_request(
  url = 'http://127.0.0.1:80/summary?id=2347&user=Thomas+Lin+Pedersen',
  content = body,
  headers = headers,
  REMOTE_ADDR = '230.45.12.45'
)

key <- random_key()
session_cookie <- session_cookie()

test_that("Requests know about session cookies", {
  # No session cookie settings
  req <- Request$new(rook)
  res <- req$respond()
  expect_null(req$session_cookie_settings)
  expect_null(res$session_cookie_settings)
  expect_false(req$has_key)
  expect_false(res$has_key)
  expect_equal(req$session, list())
  expect_equal(res$session, list())
  expect_false(req$has_session_cookie)

  # Settings but no cookie
  req <- Request$new(rook, key = key, session_cookie = session_cookie)
  res <- req$respond()
  expect_equal(req$session_cookie_settings, session_cookie)
  expect_equal(res$session_cookie_settings, session_cookie)
  expect_true(req$has_key)
  expect_true(res$has_key)
  expect_equal(req$session, list())
  expect_equal(res$session, list())
  expect_false(req$has_session_cookie)

  # Adding session cookie to request
  session_val <- list(test = 4)
  val <- url_encode(req$encode_string(jsonlite::toJSON(session_val)))
  old_cookie <- rook$HTTP_COOKIE
  rook$HTTP_COOKIE <- paste0(old_cookie, "; ", session_cookie$name, "=", val)

  # Cookie but no settings
  req <- Request$new(rook)
  res <- req$respond()
  expect_null(req$session_cookie_settings)
  expect_null(res$session_cookie_settings)
  expect_false(req$has_key)
  expect_false(res$has_key)
  expect_equal(req$session, list())
  expect_equal(res$session, list())
  expect_false(req$has_session_cookie)

  # Cookie and settings
  req <- Request$new(rook, key = key, session_cookie = session_cookie)
  res <- req$respond()
  expect_equal(req$session_cookie_settings, session_cookie)
  expect_equal(res$session_cookie_settings, session_cookie)
  expect_true(req$has_key)
  expect_true(res$has_key)
  expect_equal(req$session, session_val)
  expect_equal(res$session, session_val)
  expect_true(req$has_session_cookie)

  rook$HTTP_COOKIE <- old_cookie
})

test_that("Response knows how to handle session cookies", {
  # No session cookie settings
  req <- Request$new(rook)
  res <- req$respond()

  expect_snapshot(res$session$test <- 4)
  expect_equal(res$session, list())

  # Adding session cookie to request
  req <- Request$new(rook, key = key, session_cookie = session_cookie)
  session_val <- list(test = 4)
  val <- url_encode(req$encode_string(jsonlite::toJSON(session_val)))
  old_cookie <- rook$HTTP_COOKIE
  rook$HTTP_COOKIE <- paste0(old_cookie, "; ", session_cookie$name, "=", val)

  req <- Request$new(rook, key = key, session_cookie = session_cookie)
  res <- req$respond()

  set_cookie <- res$as_list()$headers[["set-cookie"]]

  expect_true(grepl(paste0("^", session_cookie$name, "=.*; HttpOnly$"), set_cookie))
  cookie_val <- sub(paste0("^", session_cookie$name, "=(.*); HttpOnly$"), "\\1", set_cookie)

  expect_equal(jsonlite::fromJSON(res$decode_string(url_decode(cookie_val))), res$session)

  res$session$test2 <- "A"

  set_cookie <- res$as_list()$headers[["set-cookie"]]
  cookie_val <- sub(paste0("^", session_cookie$name, "=(.*); HttpOnly$"), "\\1", set_cookie)

  expect_equal(jsonlite::fromJSON(res$decode_string(url_decode(cookie_val))), res$session)

  res$session <- NULL

  set_cookie <- res$as_list()$headers[["set-cookie"]]
  expect_equal(set_cookie, paste0(session_cookie$name, "=; Expires=Thu, 01 Jan 1970 00:00:00 GMT"))

  rook$HTTP_COOKIE <- old_cookie
})
thomasp85/reqres documentation built on June 15, 2025, 1:20 a.m.