tests/testthat/test-utils.R

test_that("can check for packages", {
  expect_true(check_for_pkg("testthat"))

  expect_error(
    check_for_pkg("not_a_package"),
    paste0(
      "The package not_a_package isn't installed but is needed for this ",
      "action.\nPlease install it with install.packages(\"not_a_package\") ",
      "and try again."
    ),
    fixed = TRUE
  )

  expect_warning(
    expect_false(check_for_pkg("not_a_package", func = warning)),
    paste0(
      "The package not_a_package isn't installed but is needed for this ",
      "action.\nPlease install it with install.packages(\"not_a_package\") ",
      "and try again."
    ),
    fixed = TRUE
  )

  expect_message(
    expect_false(check_for_pkg("not_a_package", func = message)),
    paste0(
      "The package not_a_package isn't installed but is needed for this ",
      "action.\nPlease install it with install.packages(\"not_a_package\") ",
      "and try again."
    ),
    fixed = TRUE
  )
})


test_that("path sanitization", {
  expect_identical(
    db_path_sanitize(":memory:"),
    "_memory_"
  )
})

test_that("we can remove the unique dbplyr names", {
  with_unique <- "SELECT *\nFROM `airlines` AS `zzz26`"
  with_dbplyr <- "SELECT *\nFROM `airlines` AS `dbplyr_009`"
  with_dbplyr2 <- "SELECT *\nFROM `airlines` AS `q01`"
  with_dbplyr3 <- "SELECT *\nFROM `airlines` AS `dbplyr_K614OHb94V`"
  no_unique <- "SELECT *\nFROM `airlines` AS `my_special_airlines_table`"
  with_quotes <- "SELECT *\nFROM \"airlines\" AS \"zzz16\""
  with_unique_long <- "SELECT *\nFROM `airlines` AS `zzz26666`"
  with_unique_where <- "SELECT *\nFROM `airlines` AS `zzz26`\n WHERE (0 = 1)"

  expected <- "SELECT *\nFROM `airlines` AS `removed_unique_dplyr_name`"

  expect_identical(ignore_dbplyr_unique_names(with_unique), expected)
  expect_identical(ignore_dbplyr_unique_names(with_dbplyr), expected)
  expect_identical(ignore_dbplyr_unique_names(with_dbplyr2), expected)
  expect_identical(ignore_dbplyr_unique_names(with_dbplyr3), expected)
  expect_identical(ignore_dbplyr_unique_names(no_unique), no_unique)
  expect_identical(ignore_dbplyr_unique_names(with_unique_long), expected)
  expect_identical(
    ignore_dbplyr_unique_names(ignore_quotes(with_quotes)),
    expected
  )
  expect_identical(
    ignore_dbplyr_unique_names(with_unique_where),
    paste0(expected, "\n WHERE (0 = 1)")
  )
})

test_that("debugging helper", {
  expect_true(dittodb_debug_level(-1))
  expect_true(dittodb_debug_level(0))
  expect_false(dittodb_debug_level(1))
  expect_false(dittodb_debug_level(2))
  expect_false(dittodb_debug_level(3))
  withr::with_options(
    c("dittodb.debug" = 2),
    {
      expect_true(dittodb_debug_level(-1))
      expect_true(dittodb_debug_level(0))
      expect_true(dittodb_debug_level(1))
      expect_true(dittodb_debug_level(2))
      expect_false(dittodb_debug_level(3))
    }
  )
})

test_that("set_dittodb_debug_level", {
  withr::with_options(list(
    dittodb.debug = 0
  ), {
    set_dittodb_debug_level(1)
    expect_identical(getOption("dittodb.debug"), 1)
  })
})

test_that("We ignore quote differences in statements", {
  string_with_quotes <- "Wow\"there'are`a lot of quotes here!"
  expect_identical(
    ignore_quotes(string_with_quotes),
    "Wow`there`are`a lot of quotes here!"
  )
})

test_that("sanitize_table_id()", {
  # Skip if RPostgres is not available
  check_for_pkg("RPostgres", skip)
  id_rpostgres <- RPostgres::Id(
    catalog = "cat",
    schema = "schem",
    table = "tbl"
  )
  id_rmariadb <- RMariaDB::Id(schema = "schem", table = "tbl")
  id_vector_cat <- c("cat", "schem", "tbl")
  id_vector <- c("schem", "tbl")
  id_atomic <- "tbl"

  expect_identical(sanitize_table_id(id_rpostgres), "cat.schem.tbl")
  expect_identical(sanitize_table_id(id_rmariadb), "schem.tbl")
  expect_identical(sanitize_table_id(id_vector_cat), "cat.schem.tbl")
  expect_identical(sanitize_table_id(id_vector), "schem.tbl")
  expect_identical(sanitize_table_id(id_atomic), "tbl")
  expect_identical(
    sanitize_table_id(id_atomic, schema_name = "schem"),
    "schem.tbl"
  )
})

test_that("%||%", {
  a <- "a"
  b <- "b"
  expect_identical(a %||% b, a)
  expect_identical(NULL %||% b, b)
  expect_identical(NA %||% b, NA)
})

test_that("testing_port", {
  # ensure our default tests are really default (that is: unset envvars)
  withr::with_envvar(
    list(
      "DITTODB_MARIA_TEST_PORT" = NA,
      "DITTODB_PG_TEST_PORT" = NA
    ),
    {
      expect_identical(testing_port("maria"), 3306L)
      expect_identical(testing_port("postgres"), 5432L)
    }
  )

  # now use new envvars
  withr::with_envvar(
    list(
      "DITTODB_MARIA_TEST_PORT" = "6033",
      "DITTODB_PG_TEST_PORT" = "2345"
    ),
    {
      expect_identical(testing_port("maria"), 6033L)
      expect_identical(testing_port("postgres"), 2345L)
    }
  )
})

test_that("get_dbname() works", {
  expect_equal(get_dbname(list(dbname = "db")), "db")
  expect_equal(get_dbname(list(Database = "db")), "db")
  expect_equal(get_dbname(list(dsn = "db")), "db")
  expect_equal(get_dbname(list("db")), "db")
  expect_equal(get_dbname(list("db1", dbname = "db2")), "db2")
  expect_equal(get_dbname(list("db1", Database = "db2")), "db2")
  # Empty argument (needs an error?)
  expect_error(get_dbname(list()))
  # Legitimate error
  expect_error(get_dbname(list(bogus = "oops")))
  # Empty argument, but that's ok for SQLite
  expect_equal(get_dbname(list(), drv = RSQLite::SQLite()), "ephemeral_sqlite")
  expect_equal(get_dbname(list(dbname = ""), drv = RSQLite::SQLite()), "ephemeral_sqlite")
})
ropensci/dittodb documentation built on April 13, 2024, 2:20 a.m.