test_that("normalize_codecov converts /graph/badge.svg -> /badge.svg", {
x <- c(
"https://codecov.io/gh/org/repo/graph/badge.svg",
"https://codecov.io/gh/org/repo/graph/badge.svg?token=abc",
"https://img.shields.io/badge/CRAN-ok.svg"
)
got <- vapply(x, normalize_codecov, character(1))
# core checks
expect_true(grepl("/badge.svg$", got[1]))
expect_true(grepl("/badge.svg\\?token=abc$", got[2]))
# strip names to avoid spurious failure
expect_identical(unname(got[3]), x[3])
})
test_that("parse_doc_safe parses both HTML and XML safely", {
html <- "
"
xml <- ""
expect_s3_class(parse_doc_safe(html), "xml_document")
expect_s3_class(parse_doc_safe(xml), "xml_document")
expect_null(parse_doc_safe(""))
})
test_that("list_badges() scans README and returns a data.frame (no error)", {
tmp <- tempfile(fileext = ".md")
on.exit(unlink(tmp), add = TRUE)
writeLines(c(
"# MyPkg",
# linked badge
"[](https://github.com/r-lib/testthat/actions/workflows/R-CMD-check.yaml)",
# standalone badge
""
), tmp)
out <- list_badges(tmp)
# The refactor returns a data.frame assembled from fetch_badge_value() results.
expect_true(is.data.frame(out) || length(out) >= 0)
})
test_that("fetch_badge_value() returns parsed value or NULL for SVG badges", {
testthat::skip_if_offline()
# Known public SVGs (stable providers)
urls <- c(
"https://github.com/r-lib/testthat/actions/workflows/R-CMD-check.yaml/badge.svg",
"https://codecov.io/gh/r-lib/testthat/graph/badge.svg"
)
vals <- lapply(urls, function(u) fetch_badge_value(u, timeout_secs = 10))
# Accept either list(name,value), character title, or NULL on parse errors
ok <- vapply(vals, function(v) {
is.null(v) ||
is.character(v) ||
(is.list(v) && all(c("name","value") %in% names(v)))
}, logical(1))
expect_true(all(ok))
})