tests/testthat/test-symlinks.R

test_that("symlinks work with cache, input, output paths", {
  skip_on_cran()
  skip_on_os("windows")
  skip_if_not_installed("withr")

  testInit(c("sf", "terra"), opts = list(
    "rasterTmpDir" = tempdir2(rndstr(1, 6)),
    "reproducible.inputPaths" = NULL,
    "reproducible.overwrite" = TRUE,
    reproducible.showSimilar = TRUE
  ), needInternet = TRUE)

  currentDir <- tmpdir

  linkedDir <- ifelse(dir.exists("/mnt/scratch"), file.path("/mnt/scratch", Sys.info()[["user"]]),
                      dirname(tempdir())) |>
    file.path("reproducible_test_symlinks") |>
    checkPath(create = TRUE)
  linkedCacheDir <- file.path(linkedDir, "cache") |>
    checkPath(create = TRUE)
  linkedInputDir <- file.path(linkedDir, "inputs") |>
    checkPath(create = TRUE)
  linkedOutputDir <- file.path(linkedDir, "outputs") |>
    checkPath(create = TRUE)

  cacheDir <- file.path(currentDir, "cache")
  inputDir <- file.path(currentDir, "inputs")
  outputDir <- file.path(currentDir, "outputs")

  expect_true(file.symlink(linkedCacheDir, cacheDir))
  expect_identical(fs::as_fs_path(linkedCacheDir), fs::link_path(cacheDir))

  expect_true(file.symlink(linkedInputDir, inputDir))
  expect_identical(fs::as_fs_path(linkedInputDir), fs::link_path(inputDir))

  expect_true(file.symlink(linkedOutputDir, outputDir))
  expect_identical(fs::as_fs_path(linkedOutputDir), fs::link_path(outputDir))

  withr::local_options("reproducible.cachePath" = cacheDir)

  ## CRS
  targetCRS <- paste("+proj=lcc +lat_1=49 +lat_2=77 +lat_0=0 +lon_0=-95",
                     "+x_0=0 +y_0=0 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0")

  ## get studyArea (Ontario forest management units)
  studyArea <- {
    prepInputs(
      url = "https://www.gisapplication.lrc.gov.on.ca/fmedatadownload/Packages/FORMGMT.zip",
      destinationPath = asPath(inputDir),
      targetFile = "FOREST_MANAGEMENT_UNIT.shp",
      alsoExtract = "similar",
      fun = "sf::st_read"
    ) |>
      sf::st_transform(crs = targetCRS) |>
      sf::st_union()
  } |>
    Cache()

  ## prep LCC for studyArea and write to outputDir
  LCC <- Cache(
    prepInputs,
    url = paste0("https://ftp.maps.canada.ca/pub/nrcan_rncan/",
                 "Land-cover_Couverture-du-sol/canada-landcover_canada-couverture-du-sol/",
                 "CanadaLandcover2010.zip"),
    destinationPath = asPath(inputDir),
    studyArea = studyArea, ## NOTE: this doesn't reproject the raster?
    method = "near",
    datatype = "INT2U",
    fun = "terra::rast",
    targetFile = asPath("CAN_LC_2010_CAL.tif"),
    writeTo = file.path(outputDir, "LCC_ON_FMU.tif")
  )

  ## check files exist in the correct places
  ### no files at top level
  expect_true(all(list.files(linkedDir) %in% c("cache", "inputs", "outputs")))

  ### cache files in 'cache/'
  expect_true(length(list.files(linkedCacheDir)) > 0)

  ### downloaded files etc. in 'inputs/'
  expect_true(file.exists(file.path(linkedInputDir, "CanadaLandcover2010.zip")))
  expect_true(file.exists(file.path(linkedInputDir, "CHECKSUMS.txt")))
  expect_true(file.exists(file.path(linkedInputDir, "FORMGMT.zip")))

  ### output files in 'outputs/'
  expect_true(file.exists(file.path(linkedOutputDir, "LCC_ON_FMU.tif")))
  expect_identical(terra::sources(LCC), file.path(linkedOutputDir, "LCC_ON_FMU.tif"))

  ## cleanup
  unlink(linkedDir, recursive = TRUE)
  withr::deferred_run()
})
PredictiveEcology/reproducible documentation built on April 19, 2024, 7:23 p.m.