---
title: "Testing Your Package of Tutorials"
author: David Kane
format: html
vignette: >
  %\VignetteEngine{quarto::html}
  %\VignetteIndexEntry{Testing Your Package of Tutorials}
  %\VignetteEncoding{UTF-8}
---

This vignette demonstrates how to use the **tutorial.helpers** package to "test" the tutorials in your package. I place "test" in quotes because the testing is not very extensive. We are merely ensuring that your tutorials can be knitted without error. I *think* that this guarantees that the tutorials will run when students run `learnr::run_tutorial()`, but I am not certain. This testing certainly does nothing to ensure that the substance of your tutorial is correct.

If you are using the [**testthat**](https://testthat.r-lib.org/) framework for testing, the `tests` directory would have a file called `testthat.R` which just contains:

````
library(testthat)
library(your.package)

test_check("your.package")
````

Note how the name of **your.package** is not quoted with `library()` but is quoted with `test_check()`.

Within the `tests/testthat` directory there will be a variety of testing scripts. Create a file called `test-tutorials.R`. (The file can be named whatever you want, consistent with **testthat** requirements.) It might contain:

````
tut_paths <- tutorial.helpers::return_tutorial_paths("your.package")

test_that("All tutorials can be knit without error", {
  expect_null(
    tutorial.helpers::knit_tutorials(tut_paths)
  )
})


test_that("All tutorials have the expected components", {
  expect_null(
    tutorial.helpers::check_tutorial_defaults(tut_paths)
  )
})
````

The first step in testing the tutorials in your package is to determine the full paths to all those tutorials. The `return_tutorial_paths()` returns a vector of those paths.

The second step is to confirm that all your tutorials knit without error. `knit_tutorials()`, perhaps the most useful function in the entire package, accomplishes this. If a tutorial does not knit, an error is generated and the test fails.

The third step is only relevant for tutorial creators who follow [our advice](ai.html) concerning tutorial construction. In particular, `check_tutorial_defaults()` ensures that, somewhere in each tutorial, you have included the required child documents: the `info_section` and `download_answers` chunks.

`check_tutorial_defaults()` also fails if you do not have `library(learnr)` and `library(tutorial.helpers)` in your tutorial. 

Both `knit_tutorials()` and `check_tutorial_defaults()` return `NULL`, which is why we use `expect_null()`.

