tests/testthat/test-geocode.R

test_that("geocode works", {
  # Set dummy key
  set_key("dummy_api_key")

  # Load package example data
  data(poi)

  # Input checks
  expect_error(geocode(c(1, 2, 3)))
  expect_error(geocode(c("character", NA)), "'address' contains NAs.")
  expect_error(geocode(""), "'address' contains empty strings.")
  expect_error(geocode("  "), "'address' contains empty strings.")
  expect_error(geocode("test", alternatives = NA), "'alternatives' must be a 'boolean' value.")
  expect_error(geocode("test", sf = NA), "'sf' must be a 'boolean' value.")
  expect_error(geocode("test", url_only = NA), "'url_only' must be a 'boolean' value.")

  # Check qualified query inputs
  qq <- list(
    list(
      country = "Germany",
      state = "",
      county = "",
      city = "Berlin",
      district = "",
      street = "Friedrichstr",
      houseNumber = "",
      postalCode = NA
    ),
    list(
      country = "Switzerland",
      city = "Zurich",
      street = "Hardstrasse"
    )
  )
  expect_error(geocode(list(), url_only = TRUE))
  expect_error(geocode(qq[[1]], url_only = TRUE))
  expect_error(geocode(list(list(nor = "a", valid = "query")), url_only = TRUE))
  expect_type(geocode(qq[1], url_only = TRUE), "character")
  expect_type(geocode(qq, url_only = TRUE), "character")


  # Test with API response mock
  with_mocked_bindings(
    .async_request = function(url, rps) {
      hereR:::mock$geocode_response
    },
    {
      geocoded <- geocode(address = poi$city)

      # Tests
      expect_s3_class(geocoded, c("sf", "data.frame"), exact = TRUE)
      expect_true(all(sf::st_geometry_type(geocoded) == "POINT"))
      expect_equal(nrow(geocoded), length(poi$city))
    }
  )
  with_mocked_bindings(
    .async_request = function(url, rps) {
      hereR:::mock$geocode_response
    },
    {
      geocoded <- geocode(address = poi$city, alternatives = TRUE, sf = FALSE)

      # Tests
      expect_s3_class(geocoded, "data.frame", exact = TRUE)
      expect_gt(nrow(geocoded), length(poi$city))
      expect_type(geocoded[["lat_position"]], "double")
      expect_type(geocoded[["lng_position"]], "double")
      expect_type(geocoded[["lat_access"]], "double")
      expect_type(geocoded[["lng_access"]], "double")
    }
  )
})
munterfinger/hereR documentation built on Feb. 22, 2025, 12:39 p.m.