tests/testthat/test-biblioshiny-startup.R

# Test per il controllo delle dipendenze all'avvio di Biblioshiny (issue #624).
# require()/install.packages()/installed.packages() sono sostituiti da stub: i
# test non installano nulla e non usano la rete.

load_libraries_fn <- function(failing = character(0)) {
  path <- system.file("biblioshiny", "libraries.R", package = "bibliometrix")
  testthat::skip_if(path == "", "libraries.R non disponibile")

  env <- new.env(parent = globalenv())
  env$install.packages <- function(...) invisible(NULL)
  env$installed.packages <- function(...) {
    matrix(character(0), nrow = 0, ncol = 1, dimnames = list(character(0), "Package"))
  }
  env$require <- function(package, ...) !(package %in% failing)
  sys.source(path, envir = env)
  env$libraries
}

test_that("libraries() elenca i pacchetti che non ha potuto caricare", {
  libraries <- load_libraries_fn(failing = c("pdftools", "chromote"))
  res <- suppressMessages(libraries())

  expect_type(res, "list")
  expect_named(res, c("ok", "missing", "missing_names"))
  expect_false(res$ok)

  # l'elenco leggibile conserva il requisito di versione ...
  expect_true("pdftools (>= 3.6.0)" %in% res$missing)
  expect_true("chromote" %in% res$missing)

  # ... quello per install.packages() no, cosi' la riga si incolla com'e'
  expect_setequal(res$missing_names, c("pdftools", "chromote"))
  expect_false(any(grepl(">=", res$missing_names, fixed = TRUE)))
})

test_that("libraries() non segnala nulla quando tutto si carica", {
  libraries <- load_libraries_fn()
  res <- suppressMessages(libraries())

  expect_true(res$ok)
  expect_length(res$missing, 0)
  expect_length(res$missing_names, 0)
})

test_that("i sorgenti di Biblioshiny sono puro ASCII", {
  # In una localizzazione MBCS (cinese, giapponese, coreano, cirillico su
  # Windows) R ignora encoding = "UTF-8" e decodifica i file con la codepage di
  # sistema: un carattere non-ASCII si corrompe e, se cade dentro una stringa,
  # il file non si parsa piu' e Biblioshiny non parte (issue #589). I caratteri
  # non-ASCII vanno scritti come escape \u{...} o, nell'HTML, come entita'
  # numeriche: il sorgente resta ASCII e il valore a runtime non cambia.
  dir <- system.file("biblioshiny", package = "bibliometrix")
  skip_if(dir == "", "cartella biblioshiny non disponibile")

  files <- list.files(dir, pattern = "[.]R$", full.names = TRUE)
  expect_gt(length(files), 0)

  offenders <- character(0)
  for (f in files) {
    raw <- readBin(f, "raw", file.info(f)$size)
    if (any(raw >= as.raw(128))) offenders <- c(offenders, basename(f))
  }
  expect_equal(offenders, character(0))
})

test_that("i sorgenti di Biblioshiny si parsano", {
  dir <- system.file("biblioshiny", package = "bibliometrix")
  skip_if(dir == "", "cartella biblioshiny non disponibile")

  for (f in list.files(dir, pattern = "[.]R$", full.names = TRUE)) {
    expect_no_error(parse(f))
  }
})

test_that("i sorgenti Biblioshiny non chiamano is_online()", {
  # utils.R definisce is_Online(); il vecchio nome is_online() e' esportato da
  # httr2, che l'app carica, quindi una chiamata rimasta al nome vecchio non
  # produce alcun errore: si risolve in silenzio su curl::has_internet(), che
  # sonda la connettivita' in generale invece dell'host che interessa. E'
  # esattamente quello che era successo in biblioAI.R (#570).
  dir <- system.file("biblioshiny", package = "bibliometrix")
  skip_if(dir == "", "cartella biblioshiny non disponibile")

  offenders <- character(0)
  for (f in list.files(dir, pattern = "[.]R$", full.names = TRUE)) {
    txt <- readLines(f, warn = FALSE)
    if (any(grepl("(^|[^_[:alnum:].])is_online[[:space:]]*\\(", txt))) {
      offenders <- c(offenders, basename(f))
    }
  }
  expect_equal(offenders, character(0))
})

test_that("check_online considera raggiungibile un host che risponde con un errore HTTP", {
  # Un 404 dimostra che il server ha risposto: la domanda e' la raggiungibilita',
  # non l'esito della richiesta. La radice dell'endpoint Gemini risponde 404, e
  # trattarla come offline bloccherebbe Biblio AI per tutti (#570).
  path <- system.file("biblioshiny", "utils.R", package = "bibliometrix")
  skip_if(path == "", "utils.R non disponibile")
  skip_on_cran()

  e <- new.env(parent = globalenv())
  suppressWarnings(suppressMessages(sys.source(path, envir = e)))
  skip_if_not(is.function(e$check_online))

  # host inesistente: errore di trasporto, quindi davvero non raggiungibile
  expect_false(e$check_online(host = "https://no.such.host.invalid", timeout = 2))
})

Try the bibliometrix package in your browser

Any scripts or data that you put into this service are public.

bibliometrix documentation built on Aug. 29, 2026, 5:10 p.m.