context("serializers: JSON")

test_that("JSON basic stuff", {
  expect_is(JSON, "R6ClassGenerator")
  aa <- JSON$new()
  expect_is(aa, "R6")
  expect_is(aa, "JSON")

  # vars
  expect_is(aa$file_extension, "character")
  expect_equal(aa$file_extension, ".json")
  expect_is(aa$path, "character")
  expect_match(aa$path, "\\.json")
  expect_null(aa$string)

  # methods
  expect_is(aa$serialize, "function")
  expect_is(aa$deserialize, "function")
})

test_that("JSON usage", {
  skip_on_cran()

  library(crul)
  mydir <- file.path(tempdir(), "asdfasdfsd")
  invisible(vcr_configure(dir = mydir, serialize_with = 'json'))
  unlink(file.path(vcr_c$dir, "testing1.json"))
  vcr_configuration()

  # does one request work?
  aa <- use_cassette("testing2", {
    res <- crul::HttpClient$new(hb("/get"))$get()
  })
  expect_is(aa, "Cassette")
  expect_is(res, "HttpResponse")
  expect_length(jsonlite::fromJSON(aa$file(), FALSE)[[1]], 1)

  # do two requests work?
  cc <- use_cassette("testing4", {
    ref <- crul::HttpClient$new(hb("/get"))$get()
    the <- crul::HttpClient$new(hb("/post"))$post(body = "fafaa")
  })
  expect_is(ref, "HttpResponse")
  expect_is(the, "HttpResponse")
  expect_length(jsonlite::fromJSON(cc$file(), FALSE)[[1]], 2)

  # preserve exact body bytes
  dd <- use_cassette("testing5", {
    raf <- crul::HttpClient$new(hb("/get"))$get(
      query=list(cheese="string"))
    raz <- crul::HttpClient$new(hb("/post"))$post(
      body = list(foo = "bar", baz = "ball"))
  }, preserve_exact_body_bytes = TRUE)
  expect_is(raf, "HttpResponse")
  expect_is(raz, "HttpResponse")
  expect_length(jsonlite::fromJSON(dd$file(), FALSE)[[1]], 2)
  bodies <- jsonlite::fromJSON(dd$file())[[1]]$response$body$string
  for (i in bodies) expect_true(is_base64(i))
})

test_that("JSON fails well", {
  expect_error(JSON$new(a = 5), "unused argument")

  z <- JSON$new()
  # if no path specified, fails with useful message as is
  expect_error(suppressWarnings(z$deserialize()),
    "cannot open the connection")
})
