with_mock_api({
  test_that("expect_request_header with mock API", {
    expect_request_header(
      request("https://test.api/object1/") %>%
        req_headers(Accept = "image/jpeg") %>%
        req_perform(),
      accept = "image/jpeg"
    )
    expect_request_header(
      request("https://test.api/object1/") %>%
        req_headers(Accept = "image/jpeg", `X-Stuff` = "more") %>%
        req_perform(),
      accept = ""
    )
    expect_request_header(
      request("https://test.api/object1/") %>%
        req_headers(Accept = "image/jpeg", `X-Stuff` = "more") %>%
        req_perform(),
      Accept = "image/jpeg",
      `X-stuff` = "mo",
      `x-not-present` = NULL
    )
    expect_failure(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/png") %>%
          req_perform(),
        accept = "image/jpeg"
      ),
      'Header "accept" does not match "image/jpeg"'
    )
    expect_failure(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/png") %>%
          req_perform(),
        accept = NULL
      ),
      'Header "accept" is not NULL'
    )
  })

  test_that("Args passed to expect_match", {
    expect_request_header(
      request("https://test.api/object1/") %>%
        req_headers(Accept = "image/jpeg") %>%
        req_perform(),
      accept = "image.*"
    )
    expect_failure(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/jpeg") %>%
          req_perform(),
        accept = "image.*",
        fixed = TRUE
      )
    )
    expect_request_header(
      request("https://test.api/object1/") %>%
        req_headers(Accept = "image/jpeg") %>%
        req_perform(),
      accept = "IMAGE",
      ignore.case = TRUE
    )
    expect_failure(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/jpeg") %>%
          req_perform(),
        accept = "IMAGE"
      )
    )
    expect_request_header(
      request("https://test.api/object1/") %>%
        req_headers(Accept = "image/jpeg") %>%
        req_perform(),
      accept = "image.*",
      perl = TRUE
    )
    expect_request_header(
      request("https://test.api/object1/") %>%
        req_headers(Accept = "image/jpeg") %>%
        req_perform(),
      accept = "image",
      useBytes = TRUE
    )
  })

  test_that("Input validation", {
    expect_error(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/png") %>%
          req_perform()
      ),
      "No headers provided"
    )
    expect_error(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/png") %>%
          req_perform(),
        "image/png"
      ),
      "Header values must be named"
    )
    expect_error(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/png") %>%
          req_perform(),
        accept = "image/png",
        "another"
      ),
      "Header values must be named"
    )
    expect_error(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/png") %>%
          req_perform(),
        accept = c("image", "/png")
      ),
      "Expected headers must be strings (length 1)",
      fixed = TRUE
    )
    expect_error(
      expect_request_header(
        request("https://test.api/object1/") %>%
          req_headers(Accept = "image/png") %>%
          req_perform(),
        accept = c(12, 34)
      ),
      "Expected headers must be strings (length 1)",
      fixed = TRUE
    )
  })
})

without_internet({
  test_that("expect_request_header without_internet", {
    expect_GET(
      expect_request_header(
        request("http://httpbin.not/") %>%
          req_headers(Accept = "image/jpeg") %>%
          req_perform(),
        Accept = "image/jpeg"
      )
    )
    # Because the header check fails before the stop_request() mock
    # is called, there is no GET to assert
    expect_no_request(
      expect_failure(
        expect_request_header(
          request("http://httpbin.not/") %>%
            req_headers(Accept = "image/png") %>%
            req_perform(),
          Accept = "image/jpeg"
        )
      )
    )
  })
})

test_that("expect_request_header works with actual network too", {
  expect_request_header(
    request(httpbin$url("/")) %>%
      req_headers(Accept = "image/jpeg") %>%
      req_perform(),
    Accept = "image/jpeg"
  )
  expect_failure(
    expect_request_header(
      request(httpbin$url("/")) %>%
        req_headers(Accept = "image/png") %>%
        req_perform(),
      Accept = "image/jpeg"
    )
  )
})
