context("Headers")

# Setting ---------------------------------------------------------------------

test_that("Only last duplicated header kept in add_headers", {
  expect_equal(add_headers(x = 1, x = 2)$headers, c(x = "2"))
})

test_that("Only last duplicated header kept when combined", {
  out <- c(add_headers(x = 1), add_headers(x = 2))
  expect_equal(out$headers, c(x = "2"))
})

# Getting ---------------------------------------------------------------------

test_that("All headers captures headers from redirects", {
  skip("Currently broken")
  r1 <- GET("https://httpbin.org/redirect/1")
  expect_equal(length(r1$all_headers), 1 + 1)

  r3 <- GET("https://httpbin.org/redirect/3")
  expect_equal(length(r3$all_headers), 3 + 1)
})

# Parsing ---------------------------------------------------------------------

test_that("Trailing line breaks removed", {
  header <- charToRaw("HTTP/1.1 200 OK\r\nA: B\r\n")
  expect_equal(parse_http_headers(header)[[1]]$headers$A, "B")
})

test_that("Invalid header raises error", {
  lines <- c(
    "HTTP/1.1 200 OK",
    "A: B",
    "Invalid"
  )
  header <- charToRaw(paste(lines, collapse = "\n"))
  expect_warning(parse_http_headers(header), "Failed to parse headers")
})

test_that("http status line only needs two components", {
  headers <- parse_http_headers(charToRaw("HTTP/1.1 200"))
  expect_equal(headers[[1]]$status, 200L)
})

test_that("Key/value parsing tolerates multiple ':'", {
  lines <- c(
    "HTTP/1.1 200 OK",
    "A: B:C",
    "D:E:F"
  )
  header <- charToRaw(paste(lines, collapse = "\n"))

  expect_equal(parse_http_headers(header)[[1]]$headers$A, "B:C")
  expect_equal(parse_http_headers(header)[[1]]$headers$D, "E:F")
})

test_that("cache_info() handles flagless cache control", {
  response <- list(flags = "private", `max-age` = "0", `max-stale` = "0")
  expect_equal(response[1], parse_cache_control("private"))
  expect_equal(response[2], parse_cache_control("max-age=0"))
  expect_equal(response[1:2], parse_cache_control("private, max-age=0"))
  expect_equal(
    response, parse_cache_control("private, max-age=0, max-stale=0")
  )
})
