tests/testthat/test-guard_key.R

test_that("guard_key can be constructed and verify", {
  auth <- guard_key(
    key_name = "x-api-key",
    validate = function(key, request, response) {
      if (key == "secret123") {
        return("scope1")
      }
      FALSE
    },
    user_info = function(key) {
      new_user_info(
        name_given = "API User"
      )
    },
    cookie = FALSE,
    name = "test2"
  )

  expect_equal(auth$location, "header")
  expect_equal(auth$open_api, list(type = "apiKey", `in` = "header", name = "x-api-key"))

  datastore <- new.env()
  no_auth <- reqres::Request$new(fiery::fake_request("http://example.com"))

  pass <- auth$check_request(
    request = no_auth,
    response = no_auth$respond(),
    keys = list(),
    .datastore = datastore
  )
  expect_false(pass)
  expect_null(datastore$session$fireproof$test2)

  auth$reject_response(no_auth$respond(), .datastore = datastore)
  expect_equal(no_auth$response$status, 400L)

  datastore <- new.env()
  wrong_auth <- reqres::Request$new(fiery::fake_request(
    "http://example.com",
    headers = list(
      `x-api-key` = "wrong_secret"
    )
  ))

  pass <- auth$check_request(
    request = wrong_auth,
    response = wrong_auth$respond(),
    keys = list(),
    .datastore = datastore
  )
  expect_false(pass)
  expect_equal(datastore$session$fireproof$test2, list())

  auth$reject_response(wrong_auth$respond(), .datastore = datastore)
  expect_equal(wrong_auth$response$status, 403L)
  expect_null(datastore$session$fireproof$test2)

  datastore <- new.env()
  good_auth <- reqres::Request$new(fiery::fake_request(
    "http://example.com",
    headers = list(
      `x-api-key` = "secret123"
    )
  ))

  pass <- auth$check_request(
    request = good_auth,
    response = good_auth$respond(),
    keys = list(),
    .datastore = datastore
  )
  expect_true(pass)
  expect_equal(
    datastore$session$fireproof$test2,
    new_user_info(id = NULL, provider = "local", name_given = "API User", scopes = "scope1")
  )
  auth$forbid_user(good_auth$respond(), .datastore = datastore)
  expect_equal(good_auth$response$status, 403L)
  expect_null(datastore$session$fireproof$test2)
})

test_that("guard_key works with cookie-based authentication", {
  auth <- guard_key(
    key_name = "api_token",
    validate = "my_secret_token",
    cookie = TRUE,
    name = "cookie_test"
  )

  expect_equal(auth$location, "cookie")
  expect_equal(auth$open_api, list(type = "apiKey", `in` = "cookie", name = "api_token"))

  datastore <- new.env()
  good_auth <- reqres::Request$new(fiery::fake_request(
    "http://example.com",
    headers = list(
      cookie = "api_token=my_secret_token"
    )
  ))

  pass <- auth$check_request(
    request = good_auth,
    response = good_auth$respond(),
    keys = list(),
    .datastore = datastore
  )
  expect_true(pass)
  expect_equal(
    datastore$session$fireproof$cookie_test,
    new_user_info(provider = "local", scopes = character(0))
  )
})

test_that("guard_key works with simple string secret", {
  auth <- guard_key(
    key_name = "authorization",
    validate = "simple_secret",
    cookie = FALSE,
    name = "string_test"
  )

  datastore <- new.env()
  wrong_secret <- reqres::Request$new(fiery::fake_request(
    "http://example.com",
    headers = list(
      authorization = "wrong_secret"
    )
  ))

  pass <- auth$check_request(
    request = wrong_secret,
    response = wrong_secret$respond(),
    keys = list(),
    .datastore = datastore
  )
  expect_false(pass)

  datastore <- new.env()
  correct_secret <- reqres::Request$new(fiery::fake_request(
    "http://example.com",
    headers = list(
      authorization = "simple_secret"
    )
  ))

  pass <- auth$check_request(
    request = correct_secret,
    response = correct_secret$respond(),
    keys = list(),
    .datastore = datastore
  )
  expect_true(pass)
})

test_that("guard_key respects existing response status on rejection", {
  auth <- guard_key(
    key_name = "x-api-key",
    validate = "my_secret",
    cookie = FALSE,
    name = "status_test"
  )

  datastore <- new.env()
  no_auth <- reqres::Request$new(fiery::fake_request("http://example.com"))
  response <- no_auth$respond()
  response$status <- 500L

  auth$reject_response(response, .datastore = datastore)
  # Should not overwrite non-404 status
  expect_equal(response$status, 500L)
})

test_that("guard_key passes if session already has valid user info", {
  auth <- guard_key(
    key_name = "x-api-key",
    validate = "my_secret",
    cookie = FALSE,
    name = "session_test"
  )

  datastore <- new.env()
  # Pre-populate session with user info from previous authentication
  datastore$session$fireproof$session_test <- new_user_info(
    provider = "local",
    id = "user123",
    name_given = "Existing User",
    scopes = "scope1"
  )

  # Request without any authentication header
  no_auth <- reqres::Request$new(fiery::fake_request("http://example.com"))

  pass <- auth$check_request(
    request = no_auth,
    response = no_auth$respond(),
    keys = list(),
    .datastore = datastore
  )
  # Should pass because session already has valid info
  expect_true(pass)
  # Session should remain unchanged
  expect_equal(datastore$session$fireproof$session_test$name, c(given = "Existing User"))
})

Try the fireproof package in your browser

Any scripts or data that you put into this service are public.

fireproof documentation built on Dec. 17, 2025, 5:09 p.m.