The remote-read defect survived because every test path used a local corpus, and so did the API in production. This is the only test that runs the package the way a new user does: no USCOGDATA_URL, no option, no fixture -- just install and call a verb. Gated on USCOGDATA_LIVE_TEST so offline CI skips rather than fails. Measured against the live corpus while writing this: cog_spending for one government is 3.9s for a single year and 5.9s across 2000-2022. Well above the 1.5-2.8s raw parquet scan, because the verbs also join crosswalks, resolve categories and assemble provenance.
63 lines
2.4 KiB
R
63 lines
2.4 KiB
R
# Network-gated. Set USCOGDATA_LIVE_TEST=true to run.
|
|
#
|
|
# This file exists because the defect fixed for 0.3.0 -- no remote corpus was
|
|
# readable at all, because DuckDB cannot expand a glob over generic HTTP --
|
|
# survived precisely because every other test path used a LOCAL corpus (the
|
|
# bundled fixture), and so did the API in production (a host mount). Nothing
|
|
# ever exercised the package the way a new user does.
|
|
skip_live <- function() {
|
|
testthat::skip_if_not(
|
|
identical(tolower(Sys.getenv("USCOGDATA_LIVE_TEST", "")), "true"),
|
|
"live-corpus test: set USCOGDATA_LIVE_TEST=true to run"
|
|
)
|
|
}
|
|
|
|
# The suite's setup.R pins USCOGDATA_URL to the bundled fixture, so reaching
|
|
# the default requires clearing both the env var and the option.
|
|
with_default_corpus <- function(code) {
|
|
withr::local_envvar(
|
|
USCOGDATA_URL = NA, USCOGDATA_FIXTURE_URL = NA,
|
|
.local_envir = parent.frame()
|
|
)
|
|
withr::local_options(uscogdata.url = NULL, .local_envir = parent.frame())
|
|
cog_close()
|
|
withr::defer(cog_close(), envir = parent.frame())
|
|
force(code)
|
|
}
|
|
|
|
test_that("the package reads the public corpus with no configuration at all", {
|
|
skip_live()
|
|
with_default_corpus({
|
|
g <- cog_gov_search(name = "Madison", state = "WI", type = 2)
|
|
expect_gt(nrow(g), 0)
|
|
|
|
s <- cog_spending(g$canonical_govid[1], years = 2022)
|
|
expect_gt(nrow(s), 0)
|
|
expect_true(all(c("amt_nominal", "year", "category") %in% names(s)))
|
|
|
|
# Amounts are full dollars, already x1000. A city's annual spending is
|
|
# millions, not thousands -- this catches a regression that dropped or
|
|
# doubled the conversion.
|
|
expect_gt(sum(s$amt_nominal, na.rm = TRUE), 1e6)
|
|
|
|
p <- attr(s, "provenance")
|
|
expect_true(isTRUE(p$transformations$units_conversion$applied))
|
|
expect_equal(p$transformations$units_conversion$multiplier, 1000)
|
|
})
|
|
})
|
|
|
|
test_that("a multi-decade query reads across many partitions", {
|
|
skip_live()
|
|
with_default_corpus({
|
|
g <- cog_gov_search(name = "Madison", state = "WI", type = 2)
|
|
# `years` is required on cog_spending() -- there is no full-history
|
|
# default at the reader level (the API's /profile route supplies one).
|
|
s <- cog_spending(g$canonical_govid[1], years = 2000:2022)
|
|
# Enumeration builds one read_parquet() path per requested partition. If
|
|
# the list were truncated, or silently collapsed to a single file, the
|
|
# returned span is what catches it.
|
|
expect_gt(diff(range(s$year)), 10)
|
|
expect_gt(length(unique(s$year)), 5)
|
|
})
|
|
})
|