tests/testthat/test-user_data.R

column_users <- c(
  "id", "display_name", "account_created", "description", "img", "contributor_terms", "roles", "changesets_count",
  "traces_count", "blocks_received.count", "blocks_received.active", "blocks_issued.count", "blocks_issued.active"
)

class_columns <- list(
  id = "character", display_name = "character", account_created = "POSIXct", description = "character",
  img = "character", contributor_terms = "logical", roles = "character", changesets_count = "integer",
  traces_count = "integer", blocks_received.count = "integer", blocks_received.active = "integer",
  blocks_issued.count = "integer", blocks_issued.active = "integer"
)


## Details of a user: `GET /api/0.6/user/#id` ----

test_that("osm_details_user works", {
  usr <- list()
  xml_usr <- list()
  with_mock_dir("mock_details_user", {
    usr$usr <- osm_get_user_details(user_id = "11725140")
    usr$mod <- osm_get_user_details(user_id = 61942)

    xml_usr$usr <- osm_get_user_details(user_id = "11725140", format = "xml")
    xml_usr$mod <- osm_get_user_details(user_id = 61942, format = "xml")
  })

  lapply(usr, expect_s3_class, "data.frame")
  lapply(usr, function(x) expect_named(x, column_users))

  lapply(usr, lapply, function(x) {
    mapply(function(y, cl) expect_true(inherits(y, cl)), y = x, cl = class_columns[names(x)])
  })

  # Check that time is extracted, otherwise it's 00:00:00 in local time
  lapply(usr, function(x) expect_false(unique(strftime(as.POSIXct(x$account_created), format = "%M:%S") == "00:00")))

  lapply(xml_usr, expect_s3_class, "xml_document")

  # Compare xml & R
  mapply(function(d, x) {
    expect_identical(nrow(d), xml2::xml_length(x))
  }, d = usr, x = xml_usr)


  ## Empty results

  with_mock_dir("mock_details_user_empty", {
    empty_usr <- osm_get_user_details(user_id = 2)
    xml_empty_usr <- osm_get_user_details(user_id = 2, format = "xml")
    json_empty_usr <- osm_get_user_details(user_id = 2, format = "json")
  })

  expect_s3_class(empty_usr, "data.frame")
  expect_named(empty_usr, column_users)


  mapply(
    function(x, cl) expect_true(inherits(x, cl)),
    x = empty_usr,
    cl = class_columns[names(empty_usr)]
  )

  expect_s3_class(xml_empty_usr, "xml_document")
  expect_type(json_empty_usr, "list")

  # Compare xml, json & R
  expect_identical(nrow(empty_usr), 0L)
  expect_identical(xml2::xml_length(xml_empty_usr), 0L)
  expect_identical(length(json_empty_usr$users), 0L)
})


## Details of multiple users: `GET /api/0.6/users?users=#id1,#id2,...,#idn` ----

test_that("osm_details_users works", {
  usrs <- list()
  with_mock_dir("mock_details_users", {
    usrs$usrs <- osm_get_user_details(user_id = c(1, 24, 44, 45, 46, 48, 49, 50))
    usrs$mod <- osm_get_user_details(user_id = c(61942, 564990))
  })

  lapply(usrs, expect_s3_class, "data.frame")
  lapply(usrs, function(x) expect_named(x, column_users))

  lapply(usrs, lapply, function(x) {
    mapply(function(y, cl) expect_true(inherits(y, cl)), y = x, cl = class_columns[names(x)])
  })

  # Check that time is extracted, otherwise it's 00:00:00 in local time
  lapply(usrs, function(x) expect_false(unique(strftime(as.POSIXct(x$account_created), format = "%M:%S") == "00:00")))


  ## Empty results

  with_mock_dir("mock_details_users_empty", {
    empty_usrs <- osm_get_user_details(user_id = 2:3)
  })

  expect_s3_class(empty_usrs, "data.frame")
  expect_named(empty_usrs, column_users)
  expect_identical(nrow(empty_usrs), 0L)

  mapply(
    function(x, cl) expect_true(inherits(x, cl)),
    x = empty_usrs,
    cl = class_columns[names(empty_usrs)]
  )
})


## Details of the logged-in user: `GET /api/0.6/user/details` ----

test_that("osm_details_logged_user works", {
  with_mock_dir("mock_details_logged_user", {
    usr_details <- osm_details_logged_user()
  })

  expect_type(usr_details, "list")
  expect_named(
    usr_details,
    c(
      "user", "description", "img", "contributor_terms", "roles",
      "changesets", "traces", "blocks", "home", "languages", "messages"
    )
  )
})


## Preferences of the logged-in user: `GET|PUT|DELETE /api/0.6/user/preferences` ----

test_that("osm_set-get_preferences_user works", {
  with_mock_dir("mock_get_prefs_user", {
    ###  `GET /api/0.6/user/preferences` ----
    preferences <- osm_get_preferences_user()
    preferences_xml <- osm_get_preferences_user(format = "xml")
    preferences_json <- osm_get_preferences_user(format = "json")
    ###  `GET /api/0.6/user/preferences/[your_key]` (without the brackets) ----
    preference <- osm_get_preferences_user(key = "mapcomplete-language")
    # preference <- osm_get_preferences_user(key = "gps.trace.visibility") # TODO: error due to dots?
  })

  path_xml <- tempfile(fileext = ".xml")
  with_mock_dir("mock_set_prefs_user", {
    ###  `PUT /api/0.6/user/preferences/[your_key]` ----
    expect_null(osm_set_preferences_user(key = "test-pref", value = "value"))
    ###  `DELETE /api/0.6/user/preferences/[your_key]` ----
    expect_null(osm_set_preferences_user(key = "test-pref", value = NULL))
    ###  `PUT /api/0.6/user/preferences` ----
    expect_null(osm_set_preferences_user(all_prefs = preferences))
    expect_null(osm_set_preferences_user(all_prefs = preferences_xml))
    expect_null(osm_set_preferences_user(all_prefs = preferences_json))

    xml2::write_xml(preferences_xml, file = path_xml)
    expect_null(osm_set_preferences_user(all_prefs = path_xml))
  })
  file.remove(path_xml)

  expect_s3_class(preferences, "data.frame")
  expect_named(preferences, c("key", "value"))

  expect_s3_class(preferences_xml, "xml_document")
  expect_type(preferences_json, "list")
  expect_named(preferences_json, c("version", "generator", "copyright", "attribution", "license", "preferences"))
  expect_type(preference, "character")


  expect_error(
    osm_set_preferences_user(key = "mapcomplete-language", value = preference, all_prefs = preferences_xml),
    "`key` & `value`, or `all_prefs` must be provided but not all at the same time."
  )
  expect_error(osm_set_preferences_user(), "`key` is missing with no defaults.")
  expect_error(osm_set_preferences_user(key = "mapcomplete-language"), "`value` is missing with no defaults.")
  expect_error(osm_set_preferences_user(all_prefs = "x"), "`all_prefs` is interpreted as a path to an xml file with ")
  expect_error(osm_set_preferences_user(all_prefs = TRUE), "`all_prefs` must be a path to a xml file with the ")
})

Try the osmapiR package in your browser

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

osmapiR documentation built on April 15, 2025, 9:06 a.m.