skip_on_cran()
skip_if_offline(url_parse(hb())$domain)
context("HttpClient: verb")

test_that("verb: works", {
  x <- HttpClient$new(url = hb())

  expect_is(x$verb, "function")
  expect_named(formals(x$verb), c("verb", "..."))

  aa <- x$verb('get')

  expect_is(aa, "HttpResponse")
  expect_is(aa$handle, 'curl_handle')
  expect_is(aa$content, "raw")
  expect_is(aa$method, "character")
  expect_equal(aa$method, "get")
  expect_is(aa$parse, "function")
  expect_is(aa$parse(), "character")
  expect_true(aa$success())
})

test_that("verb: works for all supported verbs + retry", {
  x <- HttpClient$new(url = hb())

  expect_is(x$verb('get', path = "get"), "HttpResponse")
  expect_is(x$verb('post', path = "post"), "HttpResponse")
  expect_is(x$verb('put', path = "put"), "HttpResponse")
  expect_is(x$verb('patch', path = "patch"), "HttpResponse")
  expect_is(x$verb('delete', path = "delete"), "HttpResponse")
  expect_is(x$verb('head'), "HttpResponse")
  expect_is(x$verb('retry', 'get', path = "status/400"), "HttpResponse")
})

test_that("verb: fails well", {
  x <- HttpClient$new(url = hb())

  # fails when non-character verb value passed
  expect_error(x$verb(5), "is.character\\(verb\\) is not TRUE")

  # fails when verb=retry, but no method passed to retry
  expect_error(x$verb('retry'), "argument \"verb\" is missing")

  # to prevent an endless loop if user supplies verb to the verb 
  # method, don't allow 'verb' to be passed to $verb()
  expect_error(x$verb('verb'), "'verb' must be one of")
  # fails correctly when unsupported verb passed
  expect_error(x$verb("foo"), "'verb' must be one of")
})

test_that("verb: with auth works", {
  cli <- HttpClient$new(url = hb(), auth = auth("foo", "bar"))
  aa <- cli$verb("get", "/basic-auth/foo/bar")

  expect_is(aa, "HttpResponse")
  expect_equal(aa$method, "get")
  expect_true(aa$success())
  expect_equal(aa$status_code, 200)
  expect_equal(aa$request$options$userpwd, "foo:bar")
})
