tests/testthat/test-utils.R

# testthat::skip_if(Sys.getenv("TEST_ONE") != "")
testthat::skip_on_cran()

test_that("crs_to_sql handles various inputs correctly", {
  # Numeric input (EPSG code)
  expect_equal(crs_to_sql(4326), "'EPSG:4326'")
  expect_equal(crs_to_sql(3857.9), "'EPSG:3857'") # casts to integer

  # Character input (WKT or PROJ string)
  expect_equal(crs_to_sql("EPSG:4326"), "'EPSG:4326'")
  
  # Character input with single quotes (SQL escaping)
  wkt_quote <- "PROJCS['Test', ...]"
  expected_quote <- "'PROJCS[''Test'', ...]'"
  expect_equal(crs_to_sql(wkt_quote), expected_quote)

  # sf crs objects
  # We construct a mock CRS object to test logic independently of PROJ/GDAL versions
  
  # Case 1: CRS with EPSG code (Standard SF object structure)
  crs_epsg <- structure(list(epsg = 4326, wkt = "GEOGCS[...]"), class = "crs")
  expect_equal(crs_to_sql(crs_epsg), "'EPSG:4326'")

  # Case 2: CRS without EPSG code (WKT only)
  # Mimic an sf object where epsg is NA
  wkt_raw <- "GEOGCS['TestCRS', ...]"
  crs_wkt <- structure(list(epsg = NA, wkt = wkt_raw), class = "crs")
  
  sql_out <- crs_to_sql(crs_wkt)
  # Should return quoted string with escaped internal quotes
  expected_wkt_sql <- "'GEOGCS[''TestCRS'', ...]'"
  expect_equal(sql_out, expected_wkt_sql)

  # NULL/NA inputs
  expect_equal(crs_to_sql(NULL), "NULL")
  expect_equal(crs_to_sql(NA), "NULL")
})

test_that("assert_col_exists validates database columns", {
  skip_if_not_installed("duckdb")
  
  # Setup dummy connection and table
  conn <- ddbs_create_conn()
  on.exit(ddbs_stop_conn(conn), add = TRUE)
  
  DBI::dbExecute(conn, "CREATE TABLE test_utils (id INTEGER, val_a DOUBLE, val_b DOUBLE)")

  # Success cases
  expect_no_error(assert_col_exists(conn, "test_utils", "id", "my_func"))
  expect_no_error(assert_col_exists(conn, "test_utils", c("id", "val_a"), "my_func"))

  # Failure cases
  # 1. Single missing column
  expect_error(
    assert_col_exists(conn, "test_utils", "missing_col", "test_ref"),
    "missing_col"
  )
  
  # 2. Partial missing columns
  expect_error(
    assert_col_exists(conn, "test_utils", c("id", "missing_one"), "test_ref"),
    "missing_one"
  )
})

Try the duckspatial package in your browser

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

duckspatial documentation built on June 22, 2026, 9:08 a.m.