tests/testthat/test-templates.R

test_that("template_candidates look for specific first", {
  expect_equal(
    path_file(template_candidates("content", "article")),
    c("content-article.html", "content.html")
  )
})

test_that("template_candidates look in template dir then pkgdown", {
  pkg_dir <- withr::local_tempdir()
  template_dir <- withr::local_tempdir()

  pkg <- list(
    src_path = pkg_dir,
    meta = list(template = list(path  = template_dir)),
    bs_version = 3
  )

  # ensure that templates_dir(pkg) returns the specific template path
  expect_equal(templates_dir(pkg), path(template_dir))

  paths <- template_candidates("content", "article", pkg = pkg)
  dirs <- unique(path_dir(paths))
  expect_equal(
    dirs,
    c(                                       # search for candidates...
      path(pkg_dir, "pkgdown", "templates"), # first in local templates
      path(template_dir),                    # second in global template path
      path_pkgdown("BS3", "templates")       # finally in pkgdown templates
    )
  )
})


test_that("look for templates_dir in right places", {
  dir <- withr::local_tempdir()
  pkg <- list(src_path = dir, meta = list(template = list()))

  # Look in site templates
  expect_equal(templates_dir(pkg), path(dir, "pkgdown", "templates"))

  # Look in specified directory
  pkg$meta$template$path <- path(withr::local_tempdir())
  expect_equal(templates_dir(pkg), pkg$meta$template$path)
})

test_that("find templates in local pkgdown first", {
  pkg <- test_path("assets", "templates-local")

  # local template used over default pkgdown template
  expect_equal(
    find_template("content", "article", pkg = pkg),
    path_abs(path(pkg, "pkgdown", "templates", "content-article.html"))
  )

  expect_equal(
    find_template("footer", "article", pkg = pkg),
    path_abs(path(pkg, "pkgdown", "templates", "footer-article.html"))
  )

  # pkgdown template used (no local template)
  expect_equal(
    find_template("content", "tutorial", pkg = pkg),
    path_pkgdown("BS3", "templates", "content-tutorial.html")
  )

  expect_equal(
    find_template("footer", "ignored", pkg = pkg),
    path_pkgdown("BS3", "templates", "footer.html")
  )
})


# Expected contents -------------------------------------------------------

test_that("BS5 templates have main + aside", {
  names <- dir(path_pkgdown("bs5", "templates"), pattern = "content-")
  names <- path_ext_remove(names)
  names <- gsub("content-", "", names)

  templates <- lapply(names, read_template_html,
    type = "content",
    pkg = list(bs_version = 5)
  )
  for (i in seq_along(templates)) {
    template <- templates[[i]]
    name <- names[[i]]

    expect_equal(xpath_length(template, ".//div/main"), 1, info = name)
    expect_equal(xpath_attr(template, ".//div/main", "id"), "main", info = name)
    expect_equal(xpath_length(template, ".//div/aside"), 1, info = name)
    expect_equal(xpath_attr(template, ".//div/aside", "class"), "col-md-3", info = name)
  }
})


# Bootstrap version resolution --------------------------------------------
test_that("Bootstrap version in template package under `template.bootstrap`", {
  path_template_package <- local_pkgdown_template_pkg(
    meta = list(template = list(bootstrap = 5))
  )

  pkg <- local_pkgdown_site(meta = list(template = list(package = "templatepackage")))

  expect_equal(pkg$bs_version, 5)
})

test_that("Bootstrap version in template package under `template.bslib.version`", {
  path_template_package <- local_pkgdown_template_pkg(
    meta = list(template = list(bslib = list(version = 5)))
  )

  pkg <- local_pkgdown_site(meta = list(template = list(package = "templatepackage")))

  expect_equal(pkg$bs_version, 5)
})

test_that("Invalid bootstrap version spec in template package", {
  path_template_package <- local_pkgdown_template_pkg(
    meta = list(template = list(bootstrap = 4, bslib = list(version = 5)))
  )

  expect_snapshot(
    error = TRUE,
    local_pkgdown_site(meta = list(template = list(package = "templatepackage")))
  )
})

test_that("Invalid bootstrap version spec in _pkgdown.yml", {
  expect_snapshot(
    error = TRUE,
    local_pkgdown_site(meta = list(template = list(
      bootstrap = 4, bslib = list(version = 5)
    )))
  )
})

test_that("Valid local Bootstrap version masks invalid template package", {
  path_template_package <- local_pkgdown_template_pkg(
    meta = list(template = list(bootstrap = 4, bslib = list(version = 5)))
  )

  expect_no_error(
    local_pkgdown_site(meta = list(template = list(
      package = "templatepackage",
      bootstrap = 5
    )))
  )
})

# Bootstrap theme resolution ----------------------------------------------
test_that("Finds Bootstrap theme in all the places", {
  pkg_sketchy <- local_pkgdown_site(meta = '
    template:
      bslib:
        preset: sketchy
        version: 5
  ')
  pkg_superhero <- local_pkgdown_site(meta = '
    template:
      bslib:
        preset: superhero
        version: 5
  ')
  pkg_cosmo <- local_pkgdown_site(meta = '
    template:
      bootstrap: 5
      bootswatch: cosmo
  ')

  pkg_yeti <- local_pkgdown_site(meta = '
    template:
      bootstrap: 5
      params:
        bootswatch: yeti
  ')

  expect_equal(get_bslib_theme(pkg_sketchy), "sketchy")
  expect_equal(get_bslib_theme(pkg_superhero), "superhero")
  expect_equal(get_bslib_theme(pkg_cosmo), "cosmo")
  expect_equal(get_bslib_theme(pkg_yeti), "yeti")
})

test_that("Warns when Bootstrap theme is specified in multiple locations", {
  pkg <- local_pkgdown_site(meta = '
    template:
      bootstrap: 5
      bootswatch: cerulean
      bslib:
        preset: flatly
        bootswatch: lux
      params:
        bootswatch: darkly
  ')

  expect_snapshot_warning(
    get_bslib_theme(pkg)
  )
})

test_that("Doesn't warn when the same Bootstrap theme is specified in multiple locations", {
  pkg <- local_pkgdown_site(meta = '
    template:
      bootswatch: cerulean
      bslib:
        preset: cerulean
  ')

  expect_equal(
    expect_silent(get_bslib_theme(pkg)),
    "cerulean"
  )
})
r-lib/pkgdown documentation built on May 1, 2024, 9:15 a.m.