tests/testthat/test-buckets.R

skip_if_not(minio_available(), "Minio Not Available")

Sys.setenv(AWS_PROFILE = "minio")
buckets_empty()

demo_rds_file <- file.path(system.file(), "Meta/demo.rds")
links_file <- file.path(system.file(), "Meta/links.rds")

test_that("aws_bucket_create", {
  expect_error(aws_bucket_create())
  expect_error(aws_bucket_create(5))
  expect_error(aws_bucket_create(letters))

  bucket <- random_bucket()
  expect_false(aws_bucket_exists(bucket))
  aws_bucket_create(bucket)
  expect_true(aws_bucket_exists(bucket))
})

test_that("aws_bucket_exists", {
  expect_error(aws_bucket_exists())
  expect_error(aws_bucket_exists(5))
  expect_error(aws_bucket_exists(letters))

  bucket <- random_bucket()

  # bucket DOES NOT exist, gives FALSE
  expect_false(aws_bucket_exists(bucket))

  # bucket DOES exist, also FALSE
  aws_bucket_create(bucket)
  expect_true(aws_bucket_exists(bucket))

  bucket_delete(bucket, force = TRUE)
})

test_that("aws_bucket_delete", {
  expect_error(aws_bucket_delete())
  expect_error(aws_bucket_delete(5))
  expect_error(aws_bucket_delete(letters))

  bucket <- random_bucket()
  aws_bucket_create(bucket)
  expect_true(aws_bucket_exists(bucket))
  res <- aws_bucket_delete(bucket, force = TRUE)
  expect_null(res)
  expect_false(aws_bucket_exists(bucket))
})

test_that("aws_bucket_download", {
  expect_error(aws_bucket_download())
  expect_error(aws_bucket_download(""))

  bucket <- random_bucket()
  aws_bucket_create(bucket)

  aws_file_upload(demo_rds_file, s3_path(bucket, basename(demo_rds_file)))
  aws_file_upload(links_file, s3_path(bucket, basename(links_file)))
  temp_dir <- file.path(tempdir(), "tmp-bucket-369")

  expect_length(list.files(temp_dir), 0)

  aws_bucket_download(bucket = bucket, dest_path = temp_dir)

  expect_length(list.files(temp_dir), 2)

  bucket_delete(bucket, force = TRUE)
})

test_that("aws_bucket_upload", {
  expect_error(aws_bucket_upload())
  expect_error(aws_bucket_upload(""))

  res <- aws_bucket_upload(
    file.path(system.file(), "Meta"),
    "metabucket",
    force = TRUE
  )

  expect_equal(NROW(aws_bucket_list_objects("metabucket")), 6)
  expect_type(res, "character")

  bucket_delete("metabucket", force = TRUE)
})

test_that("aws_bucket_list_objects", {
  expect_error(aws_bucket_list_objects())
  expect_error(aws_bucket_list_objects(5))

  bucket <- random_bucket()
  aws_bucket_create(bucket)
  ffs <- list.files(file.path(system.file(), "Meta"), full.names = TRUE)
  for (f in ffs) aws_file_upload(f, s3_path(bucket, basename(f)))

  res <- aws_bucket_list_objects(bucket)

  expect_s3_class(res, "tbl")
  expect_equal(NROW(res), 6)
  expect_s3_class(res$size, "fs_bytes")

  bucket_delete(bucket, force = TRUE)
})

test_that("aws_buckets", {
  for (i in replicate(10, random_bucket())) aws_bucket_create(i)

  res <- aws_buckets()

  expect_s3_class(res, "tbl")
  expect_gt(NROW(res), 5)

  buckets_empty()
})

test_that("aws_bucket_tree", {
  expect_error(aws_bucket_tree())
  expect_error(aws_bucket_tree("", 5))

  bucket <- random_bucket()
  aws_bucket_create(bucket)
  ffs <- list.files(file.path(system.file(), "Meta"), full.names = TRUE)
  for (f in ffs) aws_file_upload(f, s3_path(bucket, basename(f)))

  expect_output(
    res <- aws_bucket_tree(bucket),
    "s3://"
  )

  expect_type(res, "character")
  expect_length(res, 6)

  bucket_delete(bucket, force = TRUE)
})

test_that("six_bucket_upload, single file", {
  bucket <- random_bucket()
  demo_rds_file <- file.path(system.file(), "Meta/demo.rds")
  res <- six_bucket_upload(path = demo_rds_file, remote = bucket, force = TRUE)
  objs <- aws_bucket_list_objects(bucket)

  expect_type(res, "character")
  expect_length(res, 1)
  expect_match(res, bucket) # bucket is in each s3 path
  expect_equal(NROW(objs), 1)
  expect_equal(objs$key, basename(demo_rds_file))
})

test_that("six_bucket_upload, mixed inputs (file and dir)", {
  bucket <- random_bucket()
  library(fs)
  demo_rds_file <- file.path(system.file(), "Meta/demo.rds")
  tdir <- path(path_temp(), "mytmp")
  dir_create(tdir)
  purrr::map(letters, \(l) file_create(path(tdir, l)))
  res <- suppressMessages(
    six_bucket_upload(
      path = c(demo_rds_file, tdir),
      remote = bucket,
      force = TRUE
    )
  )
  objs <- aws_bucket_list_objects(bucket)

  expect_type(res, "character")
  expect_length(res, 27)
  expect_match(res, bucket) # bucket is in each s3 path
  expect_equal(NROW(objs), 27)
})

test_that("six_bucket_upload, remote includes key prefix change", {
  bucket <- random_bucket()
  library(fs)
  tdir <- path(path_temp(), "atmp")
  demo_rds_file <- file.path(system.file(), "Meta/demo.rds")
  dir_create(tdir)
  purrr::map(letters, \(l) file_create(path(tdir, l)))
  res <- suppressMessages(
    six_bucket_upload(
      path = c(demo_rds_file, tdir),
      remote = path(bucket, "some", "dir"),
      force = TRUE
    )
  )
  objs <- aws_bucket_list_objects(bucket)

  expect_type(res, "character")
  expect_length(res, 27)
  expect_match(res, bucket) # bucket is in each s3 path
  expect_match(res, "some/dir") # key prefix is in each s3 path
  expect_equal(NROW(objs), 27)
})

test_that("six_bucket_upload error behavior", {
  expect_error(
    six_bucket_upload(path = letters, remote = c("z", "z")),
    "must be length 1"
  )
  expect_error(
    six_bucket_upload(path = 5, remote = ""),
    "must be character"
  )
  expect_error(
    six_bucket_upload(path = "", remote = 5),
    "must be character"
  )
  expect_error(
    six_bucket_upload(path = "", remote = ""),
    "don't exist"
  )
  expect_error(
    six_bucket_upload(path = "", remote = ""),
    "don't exist"
  )
})

# cleanup
buckets_empty()
Sys.unsetenv("AWS_PROFILE")

Try the sixtyfour package in your browser

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

sixtyfour documentation built on April 3, 2025, 8:22 p.m.