tests/testthat/test-eacr.R

# L'EACR est embarquee dans le paquet : ces tests portent sur les fichiers
# versionnes, et echouent donc si un import les a mal ecrits ou si l'un d'eux
# manque au commit.

test_that("toutes les tables du registre sont lisibles", {
  registre <- tablesEacr()
  expect_gt(nrow(registre), 0L)

  for (nom in registre$table) {
    dt <- lireEacr(nom)
    checkmate::expect_data_table(dt, min.rows = 1L, info = nom)
    # toute table de la source porte une annee ; l'effectif est un denombrement
    # de personnes partout ou il figure -- les deux tables qui n'en ont pas
    # comptent les beneficiaires par prelevement, ou n'ont pas d'effectif du
    # tout (age conjoncturel)
    checkmate::expect_names(names(dt), must.include = "annee", info = nom)
    checkmate::expect_integer(dt$annee, any.missing = FALSE, info = nom)
    if ("effectifs" %chin% names(dt)) {
      checkmate::expect_integer(dt$effectifs, info = nom)
    }
  }
})

test_that("lireEacr refuse une table inconnue", {
  expect_error(lireEacr("K-Table_imaginaire"), "K-Table_imaginaire")
})

test_that("les codes caisse gardent leurs zeros de tete", {
  dt <- lireEacr("A-Cadrage")
  checkmate::expect_character(
    dt$cc,
    any.missing = FALSE,
    pattern = "^[0-9]{4}$"
  )
  expect_true("0010" %chin% dt$cc)
})

test_that("la table A porte les effectifs de retraites publies", {
  # Les retraites de droit direct de tous regimes, vivants au 31 decembre :
  # le chiffre que publie le Panorama. Il vaut controle de bout en bout de
  # l'import -- le filtre sur `plusRecent` tranche la double interrogation de
  # la source, et la colonne `effectifs` est bien un entier de personnes.
  #
  # Un millesime qui reviserait cette annee-la fait echouer le test : c'est le
  # signe qu'il faut relire la revision, puis inscrire ici la valeur revisee.
  dt <- lireEacr("A-Cadrage")
  droitsDirects <- dt[
    annee == 2023L &
      cc == "0000" &
      champ == "ddir" &
      sexe == "Ensemble" &
      resid == "Ensemble" &
      liq == "Ensemble" &
      statutSncf == "Ensemble" &
      plusRecent
  ]
  expect_equal(nrow(droitsDirects), 1L)
  expect_equal(droitsDirects$effectifs, 17184263L)
})

test_that("le millesime embarque decrit les deux classeurs de la source", {
  millesime <- millesimeEacr()
  expect_equal(nrow(millesime), 2L)
  expect_true(all(grepl("EACR", millesime$titre)))
})

test_that("modifier une table lue n'atteint pas la lecture suivante", {
  # Les tables sont gardees en memoire d'une lecture a l'autre : sans copie a
  # la sortie, le premier appelant qui ajoute une colonne la laisserait a tous
  # les suivants.
  avant <- lireEacr("A-Cadrage")
  avant[, colonneIntruse := 1L]
  expect_false("colonneIntruse" %chin% names(lireEacr("A-Cadrage")))
})

test_that("la lecture écarte les cellules que la source publie de travers", {
  # `setup.R` met le journal à OFF pour toute la suite : on le relève le temps
  # de l'appel, sans quoi l'avertissement ne serait pas émis.
  seuil <- logger::log_threshold()
  logger::log_threshold(logger::TRACE)
  journal <- character()
  logger::log_appender(function(lignes) journal <<- c(journal, lignes))
  on.exit(
    {
      logger::log_appender(logger::appender_console)
      logger::log_threshold(seuil)
    },
    add = TRUE
  )
  # la lecture est gardée en mémoire d'un appel à l'autre : sans quoi ce test
  # relirait la table déjà filtrée par un test précédent, et n'observerait rien
  rm(
    list = ls(legiretraite:::cacheLectureEacr),
    envir = legiretraite:::cacheLectureEacr
  )

  lue <- lireEacr("E-Minima")
  brute <- lireEacr("E-Minima", brut = TRUE)
  expect_equal(nrow(brute) - nrow(lue), 3L)
  expect_match(paste(journal, collapse = " "), "ecartee\\(s\\) a la lecture")
})

test_that("la source porte encore les défauts que la lecture écarte", {
  # Sentinelle : le jour où une vague corrigée arrivera, ce test tombera, et
  # l'entrée correspondante de `cellulesFautivesEacr` devra être retirée — le
  # retrait masquerait sinon des lignes désormais bonnes.
  fautives <- legiretraite:::cellulesFautivesEacr
  for (i in seq_len(nrow(fautives))) {
    brute <- lireEacr(fautives$table[i], brut = TRUE)
    cles <- setdiff(names(fautives), c("table", "defaut"))
    lignes <- brute[fautives[i], on = cles, nomatch = NULL]
    expect_gt(nrow(lignes), 0L)
    # le défaut recensé : le montant moyen recopie l'effectif
    expect_true(
      all(lignes$m1 == lignes$effectifs),
      info = paste(fautives$source[i], fautives$defaut[i])
    )
  }
})

Try the legiretraite package in your browser

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

legiretraite documentation built on Oct. 7, 2026, 5:09 p.m.