diff --git a/NAMESPACE b/NAMESPACE index 91a15d28e..dd0b8bdc5 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -166,6 +166,7 @@ export(use_rmarkdown_template) export(use_roxygen_md) export(use_rstudio) export(use_rstudio_preferences) +export(use_snapshot) export(use_spell_check) export(use_standalone) export(use_template) diff --git a/NEWS.md b/NEWS.md index 37d7ede9f..54295b987 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,7 @@ # usethis (development version) * `pr_resume()` (without a specific `branch`) and `pr_fetch()` (without a specific `number`) no longer error when a branch name contains curly braces (#2107, @jonthegeek). +* `use_snapshot()` is a new function to open a [testthat snapshot file]() corresponding to a given test file or R file (#2156, @jonthegeek). # usethis 3.2.1 diff --git a/R/r.R b/R/r.R index 5b865ee83..29d28ef85 100644 --- a/R/r.R +++ b/R/r.R @@ -88,6 +88,32 @@ use_test <- function(name = NULL, open = rlang::is_interactive()) { invisible(TRUE) } +#' Edit the snapshot file associated with an R or test file +#' +#' This function opens the snapshot file associated with an R or test file, if +#' one exists. +#' +#' @inheritParams use_r +#' @export +use_snapshot <- function( + name = NULL, + open = rlang::is_interactive() +) { + if (!uses_testthat()) { + use_testthat_impl() + } + + snap_name <- compute_name(name, ext = "md") + path <- proj_path("tests", "testthat", "_snaps", snap_name) + + if (!file_exists(path)) { + cli::cli_abort("No snapshot file exists for {.var {snap_name}}.") + } + edit_file(path, open = open) + + invisible(TRUE) +} + #' Create or edit a test helper file #' #' This function creates (or opens) a test helper file, typically @@ -183,7 +209,11 @@ compute_active_name <- function(path, ext, error_call = caller_env()) { path <- proj_path_prep(path_expand_r(path)) dir <- path_dir(proj_rel_path(path)) - if (!dir %in% c("R", "src", "tests/testthat", "tests/testthat/_snaps")) { + if ( + !dir %in% c("R", "src", "tests/testthat", "tests/testthat/_snaps") && + # This makes sure variants are also supported. + !grepl("tests/testthat/_snaps", dir) + ) { cli::cli_abort( "Open file must be code, test, or snapshot.", call = error_call diff --git a/_pkgdown.yml b/_pkgdown.yml index 6055e2218..63b525161 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -56,6 +56,7 @@ reference: - use_import_from - use_r - use_rmarkdown_template + - use_snapshot - use_spell_check - use_test - use_test_helper diff --git a/man/use_snapshot.Rd b/man/use_snapshot.Rd new file mode 100644 index 000000000..ee018be9c --- /dev/null +++ b/man/use_snapshot.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/r.R +\name{use_snapshot} +\alias{use_snapshot} +\title{Edit the snapshot file associated with an R or test file} +\usage{ +use_snapshot(name = NULL, open = rlang::is_interactive()) +} +\arguments{ +\item{name}{Either a string giving a file name (without directory) or +\code{NULL} to take the name from the currently open file in RStudio.} + +\item{open}{Whether to open the file for interactive editing.} +} +\description{ +This function opens the snapshot file associated with an R or test file, if +one exists. +} diff --git a/tests/testthat/_snaps/r.md b/tests/testthat/_snaps/r.md index f202815b0..925a0f9f1 100644 --- a/tests/testthat/_snaps/r.md +++ b/tests/testthat/_snaps/r.md @@ -1,3 +1,11 @@ +# use_snapshot() errors for non-existent snapshot file + + Code + use_snapshot("foo", open = FALSE) + Condition + Error in `use_snapshot()`: + ! No snapshot file exists for `foo.md`. + # use_test_helper() creates a helper file Code diff --git a/tests/testthat/test-r.R b/tests/testthat/test-r.R index 6839f088f..37059b36b 100644 --- a/tests/testthat/test-r.R +++ b/tests/testthat/test-r.R @@ -10,6 +10,24 @@ test_that("use_test() creates a test file", { expect_proj_file("tests", "testthat", "test-foo.R") }) +test_that("use_snapshot() errors for non-existent snapshot file", { + create_local_package() + expect_snapshot( + error = TRUE, + use_snapshot("foo", open = FALSE) + ) +}) + +test_that("use_snapshot() works for existing snapshot file", { + create_local_package() + path <- proj_path("tests", "testthat", "_snaps", "foo.md") + use_directory(path("tests", "testthat", "_snaps")) + write_utf8(path, "## Snapshot for foo") + expect_no_error( + use_snapshot("foo", open = FALSE) + ) +}) + test_that("use_test_helper() creates a helper file", { create_local_package()