context("handling images: httr")

tmpdir <- tempdir()
vcr_configure(dir = tmpdir)

test_that("use_cassette w/ with images: httr", {
  skip_on_cran()
  skip_if_not_installed("jpeg")
  
  library(httr)
  url <- "https://httpbin.org/image/jpeg"

  ## preserve_exact_body_bytes = FALSE
  # works on 1st request - doing a real http request
  use_cassette("test_write_httr_binary_img", {
    out <- httr::GET(url)
  })

  expect_is(out, "response")
  expect_is(out$content, "raw")
  expect_is(httr::content(out), "array")

  # works on 2nd request - using cassette
  use_cassette("test_write_httr_binary_img", {
    out2 <- httr::GET(url)
  })
  expect_is(out2, "response")
  expect_is(out2$content, "raw")
  expect_is(httr::content(out2), "array")

  expect_identical(httr::content(out), httr::content(out2))
  
  ## preserve_exact_body_bytes = TRUE
  # works on 1st request - doing a real http request
  use_cassette("test_write_httr_binary_img_bytes", {
    res1 <- httr::GET(url)
  }, preserve_exact_body_bytes = TRUE)
  
  expect_is(res1, "response")
  expect_is(res1$content, "raw")
  expect_is(httr::content(res1), "array")
  expect_equal(length(res1$content), 35588)

  use_cassette("test_write_httr_binary_img_bytes", {
    res2 <- httr::GET(url)
  }, preserve_exact_body_bytes = TRUE)
  
  expect_is(res2, "response")
  expect_is(res2$content, "raw")
  expect_is(httr::content(res2), "array")
  expect_equal(length(res2$content), 35588)
})

context("handling images: crul")

test_that("use_cassette w/ with images: crul", {
  skip_on_cran()
  
  library(crul)
  url <- "https://httpbin.org/image/jpeg"

  ## preserve_exact_body_bytes = FALSE
  # works on 1st request - doing a real http request
  use_cassette("test_write_crul_binary_img", {
    out <- crul::HttpClient$new(url)$get()
  })

  expect_is(out, "HttpResponse")
  expect_is(out$content, "raw")

  # works on 2nd request - using cassette
  use_cassette("test_write_crul_binary_img", {
    out2 <- crul::HttpClient$new(url)$get()
  })
  expect_is(out2, "HttpResponse")
  expect_is(out2$content, "raw")

  expect_identical(out$content, out2$content)


  ## preserve_exact_body_bytes = TRUE
  # works on 1st request - doing a real http request
  use_cassette("test_write_crul_binary_img_bytes", {
    res1 <- crul::HttpClient$new(url)$get()
  }, preserve_exact_body_bytes = TRUE)

  expect_is(res1, "HttpResponse")
  expect_is(res1$content, "raw")

  # works on 2nd request - using cassette
  use_cassette("test_write_crul_binary_img_bytes", {
    res2 <- crul::HttpClient$new(url)$get()
  }, preserve_exact_body_bytes = TRUE)
  expect_is(res2, "HttpResponse")
  expect_is(res2$content, "raw")

  expect_identical(res1$content, res2$content)
})

# cleanup
files <- c("test_write_httr_binary_img.yml",
  "test_write_httr_binary_img_bytes.yml",
  "test_write_crul_binary_img.yml",
  "test_write_crul_binary_img_bytes.yml")
unlink(file.path(vcr_configuration()$dir, files))

# reset configuration
vcr_configure_reset()
