context("API calling")
test_that("Deleted endpoints tell user to upgrade", {
fake410 <- fake_response("http://crunch.io/410", status_code = 410)
expect_error(
handleAPIresponse(fake410),
paste(
"The API resource at http://crunch.io/410 has moved permanently.",
"Please upgrade crunch to the latest version."
)
)
})
test_that("401 errors give informative errors", {
fake401 <- fake_response("http://crunch.io/401", status_code = 401)
with(temp.option(crunch = list(crunch.api = "url", crunch.api.key = "key")), {
expect_error(
handleAPIresponse(fake401),
"Could not connect to 'url' with key set using"
)
})
with(temp.option(crunch = list(crunch.api.key = "")), {
expect_error(
handleAPIresponse(fake401),
"No authentication key found. See"
)
})
})
test_that("get_header", {
expect_identical(get_header("bar", list(bar = 5)), 5)
expect_identical(get_header("foo", list(bar = 5)), NULL)
expect_identical(get_header("foo", list(bar = 5), default = 42), 42)
})
test_that("get_crunch_auth_config works", {
with(temp.option(
crunch = list(crunch.api = "https://app.crunch.io/api/", crunch.api.key = "key")
), {
# sends to same host
expect_equal(
get_crunch_auth_config("https://app.crunch.io/api/datasets/"),
add_headers(Authorization = paste0("Bearer ", "key"))
)
# Also sends to other crunch.io subdomains
expect_equal(
get_crunch_auth_config("https://testing.crunch.io/api/datasets/"),
add_headers(Authorization = paste0("Bearer ", "key"))
)
# But are not send outside of crunch.io
expect_equal(
get_crunch_auth_config("https://example.com"),
httr::add_headers()
)
})
})
with_mock_crunch({
test_that("Deprecation warnings report to the user", {
expect_warning(
resp <- crGET("https://app.crunch.io/deprecated/"),
paste(
"The API resource at https://app.crunch.io/api/ returned a",
"deprecation warning. Updating to the latest version of the",
"package is recommended and may resolve the issue. Details:",
'299 - "This resource is scheduled for removal on 2018-03-20"'
)
)
})
test_that("But other kinds of warnings don't look like deprecations", {
expect_warning(
resp <- crGET("https://app.crunch.io/other-warning/"),
paste(
"The API resource at https://app.crunch.io/api/ returned a",
'warning. Details: 298 - "This is some other kind of warning"'
)
)
})
test_that("crunch.debug does not print if disabled", {
expect_POST(
expect_prints(
crPOST("https://app.crunch.io/api/", body = '{"value":1}'),
NA
),
"https://app.crunch.io/api/",
'{"value":1}'
)
})
test_that("crunch.debug logging if enabled", {
with(temp.option(crunch = list(crunch.debug = TRUE)), {
expect_POST(
expect_prints(crPOST("https://app.crunch.io/api/", body = '{"value":1}'),
'\n {"value":1} \n',
fixed = TRUE
),
"https://app.crunch.io/api/",
'{"value":1}'
)
## Use testthat:: so that it doesn't print ds. Check for log printing
expect_output(
ds <- cachedLoadDataset("test ds"),
NA
)
})
})
test_that("503 on GET with Retry-After is handled", {
expect_message(
resp <- crGET("https://app.crunch.io/503/"),
"This request is taking longer than expected. Please stand by..."
)
expect_identical(resp, crGET("https://app.crunch.io/api/"))
})
test_that("404 error message includes the request URL", {
expect_error(
resp <- crGET("https://app.crunch.io/404/"),
"Client error: (404) Not Found: https://app.crunch.io/404/",
fixed = TRUE
)
})
test_that("Checking feature flags", {
expect_true(featureFlag("this_is_on"))
expect_false(featureFlag("this_is_off"))
})
test_that("crDELETE passes on and calls drop= args", {
msg <- "Drop and roll"
expect_DELETE(
crDELETE("https://app.crunch.io/", drop = stop(msg)),
"https://app.crunch.io/"
)
expect_error(
crDELETE("https://app.crunch.io/delete-me", drop = stop(msg)),
"Drop and roll"
)
})
})
test_that("retry", {
counter <- 0
f <- function() {
counter <<- counter + 1
stopifnot(counter == 3)
return(counter)
}
expect_identical(retry(f(), wait = .001), 3)
counter <- 0
expect_error(
retry(f(), wait = .001, max.tries = 2),
"counter == 3 is not TRUE"
)
})
if (run.integration.tests) {
test_that("Request headers", {
skip_if_disconnected()
r <- crGET("http://httpbin.org/gzip")
expect_true(r$gzipped)
expect_true(grepl("gzip", r$headers[["Accept-Encoding"]]))
expect_true(grepl("rcrunch", r$headers[["User-Agent"]]))
})
test_that("crunch_user_agent", {
expect_true(grepl("rcrunch", crunch_user_agent()))
expect_true(grepl("libcurl", crunch_user_agent()))
expect_error(
crunch_user_agent("anotherpackage/3.1.4"),
NA
)
expect_true(grepl("anotherpackage", crunch_user_agent("anotherpackage")))
})
with_test_authentication({
test_that("API root can be fetched", {
expect_true(is.shojiObject(getAPIRoot()))
})
})
test_that("API calls throw an error if user is not authenticated", {
with(temp.option(crunch = list(crunch.api.key = "")), {
expect_error(
getAPIRoot(),
"No authentication key found. See `help('crunch-api-key')` for more information.",
fixed = TRUE
)
})
skip("Investigate when you get 403 vs 401")
with(temp.option(crunch = list(crunch.api.key = "xyz")), {
expect_error(getAPIRoot(), "Could not connect to.+")
})
})
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.