diff --git a/R/req-perform-sequential.R b/R/req-perform-sequential.R index c26aba5d..43c77ffb 100644 --- a/R/req-perform-sequential.R +++ b/R/req-perform-sequential.R @@ -93,7 +93,11 @@ req_perform_sequential <- function( interrupt = function(cnd) { check_repeated_interrupt() - resps <- resps[seq_len(i)] + # interrupt might occur before request i completes + if (is.null(resps[[i]])) { + i <- i - 1 + } + resps <<- resps[seq_len(i)] cli::cli_alert_warning( "Terminating iteration; returning {i} response{?s}." ) diff --git a/tests/testthat/_snaps/req-perform-sequential.md b/tests/testthat/_snaps/req-perform-sequential.md index bc8a083f..f9835bb4 100644 --- a/tests/testthat/_snaps/req-perform-sequential.md +++ b/tests/testthat/_snaps/req-perform-sequential.md @@ -11,3 +11,10 @@ Error in `req_perform_sequential()`: ! If supplied, `paths` must be the same length as `reqs`. +# user termination returns completed responses + + Code + resps <- req_perform_sequential(reqs) + Message + ! Terminating iteration; returning 1 response. + diff --git a/tests/testthat/test-req-perform-sequential.R b/tests/testthat/test-req-perform-sequential.R index 6e8da59c..f38eb600 100644 --- a/tests/testthat/test-req-perform-sequential.R +++ b/tests/testthat/test-req-perform-sequential.R @@ -72,3 +72,20 @@ test_that("mocking works", { expect_equal(resps[[1]]$request, req_200) expect_s3_class(resps[[2]], "httr2_http_404") }) + +test_that("user termination returns completed responses", { + local_mocked_responses(function(req) { + if (req$url == "https://interrupt") { + interrupt() + } + response() + }) + reqs <- list( + request("https://ok"), + request("https://interrupt"), + request("https://ok") + ) + + expect_snapshot(resps <- req_perform_sequential(reqs)) + expect_length(resps, 1) +})