tests/testthat/test-util-build.R

context("dockerignore")


test_that("parse_dockerignore: empty", {
  expect_null(parse_dockerignore(character()))
  expect_null(parse_dockerignore(NULL))
  expect_null(parse_dockerignore("# foo"))
  expect_null(parse_dockerignore("  "))
  expect_null(parse_dockerignore(c("#foo", "  ", "# bar")))
})


test_that("parse_dockerignore: empty", {
  expect_null(parse_dockerignore(character()))
  expect_null(parse_dockerignore(NULL))
  expect_null(parse_dockerignore("# foo"))
  expect_null(parse_dockerignore("  "))
  expect_null(parse_dockerignore(c("#foo", "  ", "# bar")))
})


test_that("parse_dockerignore: simple", {
  expect_equal(parse_dockerignore("hello"),
               list(patterns = "hello", is_exception = FALSE))
})


test_that("parse_dockerignore: exceptions", {
  expect_equal(parse_dockerignore(c("*.md", "!README.md")),
               list(patterns = c("*.md", "README.md"),
                    is_exception = c(FALSE, TRUE)))
})


test_that("parse_dockerignore: cleanup", {
  parse_dockerignore("//a///b\\c")$patterns

  expect_equal(parse_dockerignore("a/b/c")$patterns, "a/b/c")
  expect_equal(parse_dockerignore("a//b/c")$patterns, "a/b/c")
  expect_equal(parse_dockerignore("a//b\\c")$patterns, "a/b/c")
  expect_equal(parse_dockerignore("/a//b\\c")$patterns, "a/b/c")

  ## Lots of rubbish
  expect_equal(parse_dockerignore("////a/////b///c\\\\\\d")$patterns, "a/b/c/d")
})


test_that("simple cases", {
  paths <- c(paste0("dir1/", c("a.txt", "b.md", "c.c")),
             paste0("dir2/", c("file.txt", "foo.md", "secret.json")),
             paste0("dir3/", c("bar.md", "bar.c")),
             "README.md",
             "Dockerfile")
  root <- make_fake_files(paths)
  on.exit(unlink(root, recursive = TRUE), add = TRUE)
  dockerfile <- "Dockerfile"

  expect_equal(build_file_list(root, NULL), ".")

  dockerignore <- parse_dockerignore(c("*/*.md", "dir2"))
  expect_equal(
    build_file_list(root, dockerignore),
    sort(c("Dockerfile", "README.md", "dir1/a.txt", "dir1/c.c",
           "dir3/bar.c")))

  dockerignore <- parse_dockerignore(c("*/*.md", "dir2", "!dir2/foo.md"))
  expect_equal(
    build_file_list(root, dockerignore),
    sort(c("Dockerfile", "README.md", "dir1/a.txt", "dir1/c.c",
           "dir2/foo.md", "dir3/bar.c")))

  dockerignore <- parse_dockerignore(c("**/*.md", "dir2"))
  expect_equal(
    build_file_list(root, dockerignore),
    sort(c("Dockerfile", "dir1/a.txt", "dir1/c.c",
           "dir3/bar.c")))

  dockerignore <- parse_dockerignore(c("**/*.md", "dir2", "!dir2/foo.md"))
  expect_equal(
    build_file_list(root, dockerignore),
    sort(c("Dockerfile", "dir1/a.txt", "dir1/c.c",
           "dir2/foo.md", "dir3/bar.c")))
})


test_that("build file list with excluded dockerignore", {
  paths <- c(paste0("dir1/", c("a.txt", "Dockerfile")),
             paste0("dir2/", c("file.txt", "foo.md", "secret.json")),
             "README.md")
  root <- make_fake_files(paths)
  on.exit(unlink(root, recursive = TRUE), add = TRUE)
  dockerfile <- "dir1/Dockerfile"

  writeLines("dir1", file.path(root, ".dockerignore"))

  ignore1 <- parse_dockerignore("dir1")
  ignore2 <- include_dockerfile(ignore1, root, dockerfile)
  ignore3 <- read_dockerignore(root, dockerfile)
  expect_equal(ignore2, ignore3)

  expect_equal(build_file_list(root, ignore1),
               sort(c(".dockerignore", "dir2", "README.md")))
  expect_equal(build_file_list(root, ignore2),
               sort(c(".dockerignore", "dir1/Dockerfile", "dir2", "README.md")))
  expect_equal(build_file_list(root, ignore3),
               sort(c(".dockerignore", "dir1/Dockerfile", "dir2", "README.md")))
})


test_that("build_tar", {
  skip_if_external_tar_unsupported()
  paths <- c(paste0("dir1/", c("a.txt", "Dockerfile")),
             paste0("dir2/", c("file.txt", "foo.md", "secret.json")),
             "README.md")
  root <- make_fake_files(paths)
  dockerfile <- "dir1/Dockerfile"

  x <- build_tar(root, dockerfile)
  expect_is(x, "raw")

  tmp <- untar_bin(x)

  expect_equal(dir(tmp, all.files = TRUE, recursive = TRUE),
               dir(root, all.files = TRUE, recursive = TRUE))
  unlink(tmp, recursive = TRUE)

  writeLines("dir2", file.path(root, ".dockerignore"))
  x <- build_tar(root, dockerfile)

  tmp2 <- untar_bin(x)

  f1 <- dir(tmp2, all.files = TRUE, recursive = TRUE)
  f2 <- dir(root, all.files = TRUE, recursive = TRUE)

  expect_equal(sort(f1), sort(grep("^dir2", f2, invert = TRUE, value = TRUE)))

  unlink(root, recursive = TRUE)
  unlink(tmp2, recursive = TRUE)
})


test_that("validate_tar_directory", {
  skip_if_external_tar_unsupported()
  paths <- c(paste0("dir1/", c("a.txt", "Dockerfile")),
             paste0("dir2/", c("file.txt", "foo.md", "secret.json")),
             "README.md")
  root <- make_fake_files(paths)
  on.exit(unlink(root, recursive = TRUE), add = TRUE)
  dockerfile <- "dir1/Dockerfile"

  bin <- validate_tar_directory(root, dockerfile)
  expect_is(bin, "raw")

  expect_identical(validate_tar_directory(bin), bin)
})
richfitz/stevedore documentation built on July 22, 2023, 1:13 p.m.