tests/testthat/test-zzz-precompile.R

local_disable_cache()

test_that("Can find precompiled themes", {
  # Should be present for 4, 3 without bootswatch theme
  expect_true(file.exists(precompiled_css_path(bs_theme("4"))))
  expect_true(file.exists(precompiled_css_path(bs_theme("3"))))

  # Not present for bootswatch themes
  expect_null(precompiled_css_path(bs_theme("4", "sketchy")))

  # With modifications
  theme <- bs_add_rules(bs_theme(), rules = "body { background: red; }")
  expect_null(precompiled_css_path(theme))
})


test_that("Precompiled theme output is identical to compiled themes", {
  skip_on_cran()

  get_bootstrap_path <- function(x) {
    bs_dep <- Filter(x, f = function(y) { identical(y$name, "bootstrap") })[[1]]
    bs_dep$src$file
  }

  # precompiled themes will end up in a different directory, but have identical
  # contents to non-precompiled. The dirs will be something like:
  # /tmp/RtmpVi9qRT/bslib-088b402ee16511d7
  # /tmp/RtmpVi9qRT/bslib-precompiled-4
  dir1 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4"), precompiled = FALSE))
  dir2 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4"), precompiled = TRUE))
  expect_false(identical(dir1, dir2))
  expect_true(identical_dirs(dir1, dir2))

  dir1 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("3"), precompiled = FALSE))
  dir2 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("3"), precompiled = TRUE))
  expect_false(identical(dir1, dir2))
  expect_true(identical_dirs(dir1, dir2))

  # Two calls to bs_theme_dependencies() with precompiled CSS should end up in
  # the same dir, even when caching is turned off. Something like:
  # /tmp/RtmpVi9qRT/bslib-precompiled-4
  dir1 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4"), precompiled = TRUE))
  dir2 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4"), precompiled = TRUE))
  expect_identical(dir1, dir2)

  # For default sass options, we'll end up with the precompiled dir, something
  # like:
  # /tmp/RtmpVi9qRT/bslib-precompiled-4
  default_sass_options <- eval(formals(bs_theme_dependencies)$sass_options)
  dir1 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4"), precompiled = TRUE))
  dir2 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4"), default_sass_options, precompiled = TRUE))
  expect_identical(dir1, dir2)

  # For non-default sass options, we'll end up NOT with the precompiled dir,
  # which means that it didn't use the precompiled version.
  dir1 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4"), precompiled = TRUE))
  dir2 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4"),
                             sass::sass_options(output_style = "expanded"),
                             precompiled = TRUE))
  expect_false(identical(dir1, dir2))

  # For themes where there's no precompiled version, they will be compiled to
  # the same directory whether precompiled is TRUE or FALSE. It will
  # look like:
  # /tmp/RtmpVi9qRT/bslib-5c3108f39cfd584e
  # Need to tell sass to use a cache, because otherwise it will write into a new
  # directory every time.
  cache <- sass_file_cache(tempfile())
  dir1 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4", "darkly"),
                                       cache = cache,
                                       precompiled = FALSE))
  dir2 <- get_bootstrap_path(bs_theme_dependencies(bs_theme("4", "darkly"),
                                       cache = cache,
                                       precompiled = TRUE))
  expect_true(identical(dir1, dir2))
})

Try the bslib package in your browser

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

bslib documentation built on Sept. 11, 2024, 7:49 p.m.