diff --git a/R/course.R b/R/course.R index 772743717..ce2389576 100644 --- a/R/course.R +++ b/R/course.R @@ -529,10 +529,14 @@ top_directory <- function(filenames) { in_top <- path_dir(filenames) == "." unique_top <- unique(filenames[in_top]) is_directory <- grepl("/$", unique_top) - if (length(unique_top) > 1 || !is_directory) { - NA_character_ + if (length(unique(path_dir(filenames))) == 1 && length(unique_top) == 0) { + unique_top <- unique(path_dir(filenames)) } else { - unique_top + if (length(unique_top) > 1 || !is_directory) { + NA_character_ + } else { + unique_top + } } } diff --git a/tests/testthat/ref/foo-rename.zip b/tests/testthat/ref/foo-rename.zip new file mode 100644 index 000000000..d8341e925 Binary files /dev/null and b/tests/testthat/ref/foo-rename.zip differ diff --git a/tests/testthat/ref/foo/file1.txt b/tests/testthat/ref/foo/file1.txt new file mode 100644 index 000000000..674358ffa --- /dev/null +++ b/tests/testthat/ref/foo/file1.txt @@ -0,0 +1 @@ +I am file1.txt that lives inside /foo diff --git a/tests/testthat/test-course.R b/tests/testthat/test-course.R index 0dff96f88..290158a98 100644 --- a/tests/testthat/test-course.R +++ b/tests/testthat/test-course.R @@ -106,6 +106,20 @@ test_that("tidy_unzip() deals with loose parts, reports unpack destination", { expect_identical(loose_dropbox_files, not_loose_files) }) +test_that("tidy_unzip() deals with different directory names inside zip file", { + tmp <- file_temp(ext = ".zip") + fs::file_copy(test_file("foo-rename.zip"), tmp) + dest <- tidy_unzip(tmp) + + found <- path_file(dest) + foonames <- unzip(test_file("foo-rename.zip"), list=TRUE)$Name + expected <- (unique(path_dir(foonames))) + fs::dir_delete(dest) + + expect_identical(found, expected) +}) + + ## helpers ---- test_that("create_download_url() works", { expect_equal(