context("Cookies")

h <- new_handle()

test_that("No cookies", {
  cookies <- handle_cookies(h);
  expect_is(cookies, "data.frame")
  expect_equal(nrow(cookies), 0)
})

test_that("Add some cookies", {
  req <- curl_fetch_memory(httpbin("cookies/set?foo=123&bar=ftw"), handle = h)
  cookies <- handle_cookies(h);
  expect_is(cookies, "data.frame")
  expect_equal(nrow(cookies), 2)
  expect_equal(sort(cookies$name), c("bar", "foo"))
  expect_equal(sort(cookies$value), c("123","ftw"))
  expect_true(all(cookies$expiration == Inf))
})

test_that("Coockie with connection", {
  con <- curl(httpbin("cookies"), handle = h)
  expect_equal(jsonlite::fromJSON(con)$cookies$foo, "123")
})

test_that("Delete a cookie", {
  req <- curl_fetch_memory(httpbin("cookies/delete?foo"), handle = h)
  cookies <- handle_cookies(h)
  foo <- subset(cookies, name == "foo")
  bar <- subset(cookies, name == "bar")
  expect_true(bar$expiration > Sys.time())
  expect_equal(bar$value, "ftw")

  # Recent versions of curl immediately drop the cookie
  if(nrow(foo)){
  expect_true(foo$expiration < Sys.time())
  expect_true(is.na(foo$value))
  }
})

test_that("Overwrite a cookie", {
  req <- curl_fetch_memory(httpbin("cookies/set?foo=888&bar=999"), handle = h)
  cookies <- handle_cookies(h)
  foo <- subset(cookies, name == "foo")
  bar <- subset(cookies, name == "bar")
  expect_equal(foo$value, "888")
  expect_equal(bar$value, "999")
  expect_true(all(cookies$expiration == Inf))
})

rm(h)
test_that("GC works", {
  gc()
  expect_equal(total_handles(), 0L)
})
