tests/testthat/test-client.R

# build_request() tests
test_that("build_request creates valid request object", {
  req <- build_request("NM_1_1.data.csv", list(time = "latest"), format = "")
  
  expect_s3_class(req, "httr2_request")
  expect_match(req$url, "www.nomisweb.co.uk")
  expect_match(req$url, "NM_1_1")
})

test_that("build_request includes API key when available", {
  orig_key <- getOption("nomisdata.api_key")
  withr::defer(options(nomisdata.api_key = orig_key))
  
  options(nomisdata.api_key = "test_key")
  req <- build_request("NM_1_1.data.csv", list(), format = "")
  
  expect_match(req$url, "uid=test_key")
})

test_that("build_request removes NULL parameters", {
  req <- build_request(
    "NM_1_1.data.csv",
    list(time = "latest", geography = NULL),
    format = ""
  )
  
  expect_false(grepl("geography", req$url))
  expect_true(grepl("time", req$url))
})

test_that("build_request handles empty params list", {
  req <- build_request("NM_1_1.data.csv", list(), format = "")
  
  expect_s3_class(req, "httr2_request")
})

test_that("build_request doesn't add extension when format is empty", {
  req <- build_request("NM_1_1.data.csv", list(), format = "")
  
  expect_match(req$url, "\\.csv")
})

test_that("build_request handles path with dots correctly", {
  req <- build_request("NM_1_1.def.sdmx.json", list(), format = "")
  
  expect_match(req$url, "NM_1_1\\.def\\.sdmx\\.json")
})

test_that("build_request includes multiple parameters", {
  req <- build_request(
    "NM_1_1.data.csv",
    list(time = "latest", geography = "TYPE499", measures = "20100"),
    format = ""
  )
  
  expect_match(req$url, "time=latest")
  expect_match(req$url, "geography=TYPE499")
  expect_match(req$url, "measures=20100")
})

test_that("build_request sets user agent", {
  req <- build_request("NM_1_1.data.csv", list(), format = "")
  
  expect_true(!is.null(req$headers))
})

test_that("build_request configures retry logic", {
  req <- build_request("NM_1_1.data.csv", list(), format = "")
  
  expect_s3_class(req, "httr2_request")
})

test_that("build_request doesn't include API key when not set", {
  orig_key <- getOption("nomisdata.api_key")
  withr::defer(options(nomisdata.api_key = orig_key))
  
  options(nomisdata.api_key = NULL)
  req <- build_request("NM_1_1.data.csv", list(), format = "")
  
  expect_false(grepl("uid=", req$url))
})

# execute_request() tests
test_that("execute_request returns httr2_response", {
  skip_if_no_api()
  skip_on_cran()
  
  req <- build_request("NM_1_1.overview.json", list(), format = "")
  resp <- execute_request(req)
  
  expect_s3_class(resp, "httr2_response")
})

test_that("execute_request handles valid requests", {
  skip_if_no_api()
  skip_on_cran()
  
  req <- build_request("NM_1_1.overview.json", list(), format = "")
  
  expect_error(execute_request(req), NA)
})

# Integration tests
test_that("build_request and execute_request work together", {
  skip_if_no_api()
  skip_on_cran()
  
  req <- build_request("NM_1_1.overview.json", list(), format = "")
  resp <- execute_request(req)
  
  expect_s3_class(resp, "httr2_response")
})

test_that("full request cycle works", {
  skip_if_no_api()
  skip_on_cran()
  
  req <- build_request("NM_1_1.overview.json", list(), format = "")
  resp <- execute_request(req)
  parsed <- parse_json_response(resp)
  
  expect_type(parsed, "list")
})

test_that("build_request handles special characters in parameters", {
  req <- build_request(
    "NM_1_1.data.csv",
    list(search = "*test*"),
    format = ""
  )
  
  expect_s3_class(req, "httr2_request")
})

test_that("build_request constructs base URL correctly", {
  req <- build_request("test.csv", list(), format = "")
  
  expect_match(req$url, "www.nomisweb.co.uk")
  expect_match(req$url, "api/v01/dataset")
})

test_that("handle_error_body returns character", {
  # Test with a mock response structure
  expect_type(
    handle_error_body(structure(list(), class = "httr2_response")),
    "character"
  )
})

test_that("parse_csv_response converts to tibble", {
  skip_if_no_api()
  skip_on_cran()
  
  req <- build_request("NM_1_1.data.csv", 
                       list(time = "latest", geography = "TYPE499", 
                            measures = "20100", RecordLimit = "5"),
                       format = "")
  resp <- execute_request(req)
  result <- parse_csv_response(resp)
  
  expect_s3_class(result, "tbl_df")
})

test_that("parse_json_response returns list", {
  skip_if_no_api()
  skip_on_cran()
  
  req <- build_request("NM_1_1.overview.json", list(), format = "")
  resp <- execute_request(req)
  result <- parse_json_response(resp)
  
  expect_type(result, "list")
})

Try the nomisdata package in your browser

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

nomisdata documentation built on Feb. 10, 2026, 5:10 p.m.