test_that("Eurostat JSON-stat parser preserves dimensions and sparse status", { p <- test_path("fixtures", "eurostat.json") obj <- jsonlite::fromJSON(p, simplifyVector = FALSE) dat <- AIofficial:::.sf_flatten_jsonstat(obj) expect_equal(nrow(dat), 4) expect_equal(dat$geo, c("ES", "ES", "FR", "FR")) expect_equal(dat$time, c("2024", "2025", "2024", "2025")) expect_equal(dat$value, c(48600000, 49000000, 68300000, 68600000)) expect_equal(dat$status[2], "p") }) test_that("provider URL builders are deterministic", { u1 <- eurostat_url("demo_pjan", list(geo = "ES", time = "2025")) expect_match(u1, "ec.europa.eu/eurostat/api/dissemination/statistics/1.0/data/demo_pjan", fixed = TRUE) expect_match(u1, "geo=ES", fixed = TRUE) u2 <- worldbank_url("SP.POP.TOTL", "FRA", 2020, 2025) expect_match(u2, "api.worldbank.org/v2/country/FRA/indicator/SP.POP.TOTL", fixed = TRUE) expect_match(u2, "date=", fixed = TRUE) expect_match(u2, "2020", fixed = TRUE) expect_match(u2, "2025", fixed = TRUE) u3 <- oecd_url("OECD.SDD.STES", "DSD_STES@DF_CLI", start_period = "2025") expect_match(u3, "sdmx.oecd.org/public/rest/data/", fixed = TRUE) expect_match(u3, "startPeriod=2025", fixed = TRUE) }) test_that("provider row converts to stat_reference", { x <- data.frame( .provider = "Example NSO", .dataset = "DS1", .source_url = "https://example.org/data", .retrieved_at = as.POSIXct("2026-01-01", tz = "UTC"), .indicator = "unemployment rate", .indicator_code = "UNE", .geo = "Exampleland", .geo_code = "EX", .time = "2025", .unit = "percent", .value = 5.1, .quality_flag = "provisional", .revision = NA_character_, stringsAsFactors = FALSE ) attr(x, "provider") <- "Example NSO"; attr(x, "dataset") <- "DS1"; attr(x, "source_url") <- "https://example.org/data" class(x) <- c("stat_provider_data", "data.frame") ref <- as_stat_reference(x) expect_s3_class(ref, "stat_reference") expect_equal(ref$value, 5.1) expect_equal(ref$quality_flag, "provisional") }) test_that("World Bank fixture maps to canonical provider data", { p <- test_path("fixtures", "worldbank.json") m <- test_path("fixtures", "worldbank_meta.json") rows <- AIofficial:::.sf_wb_rows(jsonlite::fromJSON(p, simplifyVector = FALSE))$rows meta_rows <- AIofficial:::.sf_wb_rows(jsonlite::fromJSON(m, simplifyVector = FALSE))$rows dat <- AIofficial:::.sf_wb_to_provider(rows, meta_rows[[1]], "SP.POP.TOTL", source = "2", source_url = "fixture://worldbank") expect_s3_class(dat, "stat_provider_data") expect_equal(nrow(dat), 2) expect_equal(dat$.indicator[1], "Population, total") expect_equal(dat$.geo_code, c("FRA", "ESP")) expect_equal(dat$.unit[1], "persons") }) test_that("OECD fixture maps standard SDMX CSV columns", { p <- test_path("fixtures", "oecd.csv") raw <- utils::read.csv(p, stringsAsFactors = FALSE, check.names = FALSE) dat <- AIofficial:::.sf_oecd_to_provider(raw, "OECD.TEST", "DSD_TEST@DF_TEST", source_url = "fixture://oecd") expect_s3_class(dat, "stat_provider_data") expect_equal(dat$.geo[1], "France") expect_equal(dat$.time[1], "2025") expect_equal(dat$.value[1], 68.2) expect_equal(dat$.unit[1], "Percent of labour force") })