# Frozen, representative provider JSON schemas; not claimed to be verbatim live responses.
fixture <- function(name) {
path <- testthat::test_path("..", "fixtures", paste0(name, ".json"))
jsonlite::fromJSON(path, simplifyVector = FALSE)
}
test_that("Crossref contract preserves DOI, title, authors and dates", {
payload <- fixture("crossref-works")
articles <- process_crossref_response(payload)
expect_length(articles, 2L)
expect_s3_class(articles[[1L]], "Article")
expect_identical(articles[[1L]]$title, "A study of Gaussian processes")
expect_identical(articles[[1L]]$doi, "10.1000/example")
expect_identical(articles[[1L]]$authors, c("Ada Lovelace", "Grace Hopper"))
expect_identical(articles[[1L]]$publication_date, "2024-04-12")
expect_identical(articles[[1L]]$abstract, "Measured results")
expect_null(articles[[2L]]$abstract)
expect_identical(articles[[2L]]$publication_date, "2023")
})
test_that("OpenAlex contract reconstructs inverted abstracts and optional fields", {
articles <- process_openalex_response(fixture("openalex-works"))
expect_length(articles, 2L)
expect_identical(articles[[1L]]$doi, "10.1000/example")
expect_identical(articles[[1L]]$abstract, "Measured results")
expect_identical(articles[[1L]]$authors, c("Ada Lovelace", "Grace Hopper"))
expect_identical(articles[[2L]]$title, "Work without DOI")
expect_null(articles[[2L]]$doi)
expect_null(articles[[2L]]$abstract)
})
test_that("Scopus contract preserves raw author sequence and optional metadata", {
articles <- process_scopus_response(fixture("scopus-search"))
expect_length(articles, 2L)
expect_identical(articles[[1L]]$authors,
c("Lovelace, Ada", "Hopper, Grace"))
expect_identical(articles[[1L]]$doi, "10.1000/example")
expect_null(articles[[2L]]$doi)
expect_null(articles[[2L]]$abstract)
})
test_that("Crossref and OpenAlex fixtures reconcile conservatively", {
crossref <- process_crossref_response(fixture("crossref-works"))
openalex <- process_openalex_response(fixture("openalex-works"))
result <- deduplicate_articles(c(crossref, openalex), report = TRUE)
expect_equal(length(result$articles), 3L)
expect_equal(result$mapping$output_index[[3L]], 1L)
expect_identical(result$articles[[1L]]$abstract,
"Measured results")
expect_true(any(result$conflicts$field == "abstract"))
})