Skip to content

expect_snapshot and friends suggest incorrect review and accept code when variant is not NULL #2325

@mrcaseb

Description

@mrcaseb

Let's start with what I am observing during package development:

When passing a variant to expect_snapshot() or expect_snapshot_value() the printed snapshot_hint prints incorrect files as running the suggested code results in #> No snapshots to update.
The printed files are the name of the test file and it misses the variant directory.

Since I don't really know the internals of testthat, I had a hard time creating a reprex. I went off of #1545 and was asked by Hadley to file a new issue in #1545 (comment)

library(testthat)
# I need test_dir as path for snapshot_review
test_dir <- withr::local_tempdir()
# and I need snap_dir as path where snapshots should be saved to
snap_dir <- file.path(test_dir, "_snaps")
snapper <- testthat:::local_snapshotter(snap_dir)

snapper$start_file("test", "test")
test_that("test", {
  local_edition(3)
  expect_snapshot_value("a", variant = "barret")
})
#> ── Warning: test ───────────────────────────────────────────────────────────────
#> Adding new snapshot for variant 'barret':
#> "a"
#> Test passed with 1 success 🎉.
snapper$end_file()

list.files(test_dir, recursive = TRUE)
#> [1] "_snaps/barret/test.md"

snapper$start_file("test", "test")
test_that("test", {
  local_edition(3)
  expect_snapshot_value("b", variant = "barret")
})
#> ── Failure: test ───────────────────────────────────────────────────────────────
#> Snapshot of "b" has changed (variant 'barret'):
#>     old | new    
#> [1] a   - b   [1]
#> * Run `testthat::snapshot_accept("test")` to accept the change.
#> * Run `testthat::snapshot_review("test")` to review the change.
#> Error:
#> ! Test failed with 1 failure and 0 successes.
snapper$end_file()
list.files(test_dir, recursive = TRUE)
#> [1] "_snaps/barret/test.md"     "_snaps/barret/test.new.md"

# The suggested code: doesn't work
snapshot_review("test", path = test_dir)
#> No snapshots to update.

# The following two work as expected

# what snapshot_meta expects us to pass
snapshot_review("barret/", path = test_dir)

# also works because it checks all recursive dirs? 
# I wonder if this would let us review more than we wanted if 
# there were other changed snapshots in other sub directories.
snapshot_review(path = test_dir)

Created on 2026-02-19 with reprex v2.1.1

Session info

sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.5.2 Patched (2025-10-31 r88977)
#>  os       macOS Tahoe 26.2
#>  system   aarch64, darwin20
#>  ui       X11
#>  language en
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Europe/Berlin
#>  date     2026-02-19
#>  pandoc   3.6.3 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/aarch64/ (via rmarkdown)
#>  quarto   1.7.33 @ /usr/local/bin/quarto
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date (UTC) lib source
#>  brio          1.1.5   2024-04-24 [1] CRAN (R 4.5.0)
#>  cli           3.6.5   2025-04-23 [1] CRAN (R 4.5.0)
#>  crayon        1.5.3   2024-06-20 [1] CRAN (R 4.5.0)
#>  desc          1.4.3   2023-12-10 [1] CRAN (R 4.5.0)
#>  diffobj       0.3.6   2025-04-21 [1] CRAN (R 4.5.0)
#>  diffviewer    0.1.2   2024-06-12 [1] CRAN (R 4.5.0)
#>  digest        0.6.39  2025-11-19 [1] CRAN (R 4.5.2)
#>  evaluate      1.0.5   2025-08-27 [1] CRAN (R 4.5.0)
#>  fastmap       1.2.0   2024-05-15 [1] CRAN (R 4.5.0)
#>  fs            1.6.6   2025-04-12 [1] CRAN (R 4.5.0)
#>  glue          1.8.0   2024-09-30 [1] CRAN (R 4.5.0)
#>  htmltools     0.5.9   2025-12-04 [1] CRAN (R 4.5.2)
#>  httpuv        1.6.16  2025-04-16 [1] CRAN (R 4.5.0)
#>  jsonlite      2.0.0   2025-03-27 [1] CRAN (R 4.5.0)
#>  knitr         1.51    2025-12-20 [1] CRAN (R 4.5.2)
#>  later         1.4.6   2026-02-13 [1] CRAN (R 4.5.2)
#>  lifecycle     1.0.5   2026-01-08 [1] CRAN (R 4.5.2)
#>  magrittr      2.0.4   2025-09-12 [1] CRAN (R 4.5.0)
#>  mime          0.13    2025-03-17 [1] CRAN (R 4.5.0)
#>  otel          0.2.0   2025-08-29 [1] CRAN (R 4.5.0)
#>  pillar        1.11.1  2025-09-17 [1] CRAN (R 4.5.0)
#>  pkgload       1.5.0   2026-02-03 [1] CRAN (R 4.5.2)
#>  promises      1.5.0   2025-11-01 [1] CRAN (R 4.5.0)
#>  R6            2.6.1   2025-02-15 [1] CRAN (R 4.5.0)
#>  Rcpp          1.1.1   2026-01-10 [1] CRAN (R 4.5.2)
#>  reprex        2.1.1   2024-07-06 [1] CRAN (R 4.5.0)
#>  rlang         1.1.7   2026-01-09 [1] CRAN (R 4.5.2)
#>  rmarkdown     2.30    2025-09-28 [1] CRAN (R 4.5.0)
#>  rprojroot     2.1.1   2025-08-26 [1] CRAN (R 4.5.0)
#>  rstudioapi    0.18.0  2026-01-16 [1] CRAN (R 4.5.2)
#>  sessioninfo   1.2.3   2025-02-05 [1] CRAN (R 4.5.0)
#>  shiny         1.12.1  2025-12-09 [1] CRAN (R 4.5.2)
#>  testthat    * 3.3.2   2026-01-11 [1] CRAN (R 4.5.2)
#>  vctrs         0.7.1   2026-01-23 [1] CRAN (R 4.5.2)
#>  waldo         0.6.2   2025-07-11 [1] CRAN (R 4.5.0)
#>  withr         3.0.2   2024-10-28 [1] CRAN (R 4.5.0)
#>  xfun          0.56    2026-01-18 [1] CRAN (R 4.5.2)
#>  xtable        1.8-4   2019-04-21 [1] CRAN (R 4.5.0)
#>  yaml          2.3.12  2025-12-10 [1] CRAN (R 4.5.2)
#> 
#>  [2] /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/library
#>  * ── Packages attached to the search path.
#> 
#> ──────────────────────────────────────────────────────────────────────────────

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions