Skip to content

Commit 79a9ed8

Browse files
authored
Snapshot refactoring (#2199)
* Generalise `test_file_reporter()` so we no longer need `test_files_reporter_parallel()` * Add new `local_test_snapshotter()` * Remove code needed for old R * Drop deprecated argument `local_snapshotter()` is [only used in devtools](https://github.com/search?q=org%3Acran+local_snapshotter+&type=code). In preparation for #2066
1 parent b626c06 commit 79a9ed8

File tree

8 files changed

+48
-58
lines changed

8 files changed

+48
-58
lines changed

R/parallel.R

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ test_files_parallel <- function(
6565
)
6666

6767
withr::with_dir(test_dir, {
68-
reporters <- test_files_reporter_parallel(reporter)
68+
reporters <- test_files_reporter(reporter, "parallel")
6969
with_reporter(reporters$multi, {
7070
parallel_updates <- reporter$capabilities$parallel_updates
7171
if (parallel_updates) {
@@ -83,23 +83,6 @@ test_files_parallel <- function(
8383
})
8484
}
8585

86-
test_files_reporter_parallel <- function(reporter, .env = parent.frame()) {
87-
lister <- ListReporter$new()
88-
snapshotter <- MainprocessSnapshotReporter$new("_snaps")
89-
reporters <- list(
90-
find_reporter(reporter),
91-
lister, # track data
92-
snapshotter
93-
)
94-
withr::local_options(
95-
"testthat.snapshotter" = snapshotter,
96-
.local_envir = .env
97-
)
98-
list(
99-
multi = MultiReporter$new(reporters = compact(reporters)),
100-
list = lister
101-
)
102-
}
10386

10487
default_num_cpus <- function() {
10588
# Use common option, if set

R/snapshot-file-snaps.R

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,6 @@ FileSnaps <- R6::R6Class(
3939
},
4040

4141
append = function(test, variant, data) {
42-
if (!has_name(self$snaps, variant)) {
43-
# Needed for R < 3.6
44-
self$snaps[[variant]] <- list()
45-
}
46-
4742
self$snaps[[variant]][[test]] <- c(self$snaps[[variant]][[test]], data)
4843
length(self$snaps[[variant]][[test]])
4944
},

R/snapshot-reporter.R

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ SnapshotReporter <- R6::R6Class(
140140
return()
141141
}
142142

143-
# If expectation errors or skips, need to reset remaining snapshots
143+
# If expectation errors or skips, need to copy snapshots from old to cur
144144
if (expectation_error(result) || expectation_skip(result)) {
145145
self$cur_snaps$reset(self$test, self$old_snaps)
146146
}
@@ -204,23 +204,19 @@ get_snapshotter <- function() {
204204
#' @export
205205
#' @keywords internal
206206
local_snapshotter <- function(
207-
snap_dir = NULL,
207+
reporter = SnapshotReporter,
208+
snap_dir = "_snaps",
208209
cleanup = FALSE,
209210
fail_on_new = NULL,
210-
.env = parent.frame()
211+
frame = caller_env()
211212
) {
212-
snap_dir <- snap_dir %||% withr::local_tempdir(.local_envir = .env)
213-
reporter <- SnapshotReporter$new(
214-
snap_dir = snap_dir,
215-
fail_on_new = fail_on_new
216-
)
217-
if (!identical(cleanup, FALSE)) {
218-
cli::cli_warn("{.arg cleanup} is deprecated.")
219-
}
213+
reporter <- reporter$new(snap_dir = snap_dir, fail_on_new = fail_on_new)
214+
withr::local_options("testthat.snapshotter" = reporter, .local_envir = frame)
220215

221-
withr::local_options(
222-
"testthat.snapshotter" = reporter,
223-
.local_envir = .env
224-
)
225216
reporter
226217
}
218+
219+
local_test_snapshotter <- function(snap_dir = NULL, frame = caller_env()) {
220+
snap_dir <- snap_dir %||% withr::local_tempdir(.local_envir = frame)
221+
local_snapshotter(snap_dir = snap_dir, fail_on_new = FALSE, frame = frame)
222+
}

R/test-files.R

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ test_files_serial <- function(
221221
local_testing_env(env)
222222

223223
test_files_setup_state(test_dir, test_package, load_helpers, env)
224-
reporters <- test_files_reporter(reporter)
224+
reporters <- test_files_reporter(reporter, "serial")
225225

226226
with_reporter(
227227
reporters$multi,
@@ -315,15 +315,30 @@ test_files_setup_state <- function(
315315
withr::defer(source_test_teardown(".", env), frame) # old school
316316
}
317317

318-
test_files_reporter <- function(reporter, .env = parent.frame()) {
318+
test_files_reporter <- function(
319+
reporter,
320+
mode = c("serial", "parallel"),
321+
frame = caller_env()
322+
) {
323+
mode <- arg_match(mode)
324+
325+
# User selected reporter
326+
user <- find_reporter(reporter)
327+
328+
# Reporter that collect test results
319329
lister <- ListReporter$new()
320-
reporters <- list(
321-
find_reporter(reporter),
322-
lister, # track data
323-
local_snapshotter("_snaps", .env = .env)
324-
)
330+
331+
# Snapshot reporter
332+
if (mode == "parallel") {
333+
snap_base <- MainprocessSnapshotReporter
334+
} else {
335+
snap_base <- SnapshotReporter
336+
}
337+
snap <- local_snapshotter(snap_base, fail_on_new = on_ci(), frame = frame)
338+
339+
reporters <- compact(list(user, lister, snap))
325340
list(
326-
multi = MultiReporter$new(reporters = compact(reporters)),
341+
multi = MultiReporter$new(reporters = reporters),
327342
list = lister
328343
)
329344
}

man/local_snapshotter.Rd

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-snapshot-file.R

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ test_that("expect_snapshot_file finds duplicate snapshot files", {
5050
})
5151

5252
test_that("basic workflow", {
53-
snapper <- local_snapshotter(fail_on_new = FALSE)
53+
snapper <- local_test_snapshotter()
5454

5555
path <- write_tmp_lines(letters)
5656
# warns on first run
@@ -71,7 +71,7 @@ test_that("basic workflow", {
7171
})
7272

7373
test_that("can announce snapshot file", {
74-
snapper <- local_snapshotter(fail_on_new = FALSE)
74+
snapper <- local_test_snapshotter()
7575
snapper$start_file("snapshot-announce", "test")
7676
announce_snapshot_file(name = "bar.svg")
7777
expect_equal(snapper$snap_file_seen, "snapshot-announce/bar.svg")

tests/testthat/test-snapshot-reporter.R

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
test_that("can establish local snapshotter for testing", {
2-
snapper <- local_snapshotter(fail_on_new = FALSE)
2+
snapper <- local_test_snapshotter()
33

44
snapper$start_file("snapshot-1", "test")
55
expect_true(snapper$is_active())
@@ -9,7 +9,7 @@ test_that("can establish local snapshotter for testing", {
99

1010
test_that("basic workflow", {
1111
path <- withr::local_tempdir()
12-
snapper <- local_snapshotter(path, fail_on_new = FALSE)
12+
snapper <- local_test_snapshotter(snap_dir = path)
1313
snapper$start_file("snapshot-2")
1414
# output if not active (because test not set here)
1515
expect_snapshot_output("x") |>
@@ -42,15 +42,15 @@ test_that("defaults to failing on CI", {
4242
withr::local_envvar(CI = "true")
4343

4444
path <- withr::local_tempdir()
45-
snapper <- local_snapshotter(path)
45+
snapper <- local_snapshotter(snap_dir = path)
4646
snapper$start_file("snapshot-2")
4747
# warns on first creation
4848
snapper$start_file("snapshot-2", "test")
4949
expect_error(expect_snapshot_output("x"), "Adding new")
5050
})
5151

5252
test_that("only create new files for changed variants", {
53-
snapper <- local_snapshotter(fail_on_new = FALSE)
53+
snapper <- local_test_snapshotter()
5454
snapper$start_file("variants", "test")
5555
expect_warning(expect_snapshot_output("x"), "Adding new")
5656
expect_warning(expect_snapshot_output("x", variant = "a"), "Adding new")
@@ -86,7 +86,7 @@ test_that("only create new files for changed variants", {
8686
})
8787

8888
test_that("only reverting change in variant deletes .new", {
89-
snapper <- local_snapshotter(fail_on_new = FALSE)
89+
snapper <- local_test_snapshotter()
9090
snapper$start_file("v", "test")
9191
expect_warning(expect_snapshot_output("x", variant = "a"), "Adding new")
9292
expect_warning(expect_snapshot_output("x", variant = "b"), "Adding new")
@@ -109,7 +109,7 @@ test_that("only reverting change in variant deletes .new", {
109109

110110
test_that("removing tests removes snap file", {
111111
path <- withr::local_tempdir()
112-
snapper <- local_snapshotter(path, fail_on_new = FALSE)
112+
snapper <- local_test_snapshotter(snap_dir = path)
113113
snapper$start_file("snapshot-3", "test")
114114
expect_warning(expect_snapshot_output("x"), "Adding new")
115115
snapper$end_file()
@@ -121,7 +121,7 @@ test_that("removing tests removes snap file", {
121121
})
122122

123123
test_that("errors in test doesn't change snapshot", {
124-
snapper <- local_snapshotter(fail_on_new = FALSE)
124+
snapper <- local_test_snapshotter()
125125

126126
# First run
127127
snapper$start_file("snapshot-5", "test")

tests/testthat/test-snapshot-value.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ test_that("reparse handles common cases", {
3232
})
3333

3434
test_that("errors if can't roundtrip", {
35-
snapper <- local_snapshotter(fail_on_new = FALSE)
35+
snapper <- local_test_snapshotter()
3636
snapper$start_file("snapshot-4", "test")
3737

3838
expect_error(expect_snapshot_value(NULL), "safely serialized")

0 commit comments

Comments
 (0)