Nothing
test_that("ecb_data input validation works", {
# flow should be a character(1)
expect_error(ecb_data(1L, "D.USD.EUR.SP00.A"))
expect_error(ecb_data(TRUE, "D.USD.EUR.SP00.A"))
expect_error(ecb_data(NULL, "D.USD.EUR.SP00.A"))
expect_error(ecb_data(NA, "D.USD.EUR.SP00.A"))
expect_error(ecb_data(c("EXR", "EXR"), "D.USD.EUR.SP00.A"))
# key should be a character() or NULL
expect_error(ecb_data("EXR", 1L))
expect_error(ecb_data("EXR", TRUE))
expect_error(ecb_data("EXR", NA))
# start_period should be a character(1) or NULL
expect_error(ecb_data("abcde", "abc", start_period = 1L))
expect_error(ecb_data("abcde", "abc", start_period = TRUE))
expect_error(ecb_data("abcde", "abc", start_period = c("a", "b")))
# end_period should be a character(1) or NULL
expect_error(ecb_data("abcde", "abc", TRUE))
expect_error(ecb_data("abcde", "abc", end_period = 1L))
expect_error(ecb_data("abcde", "abc", end_period = c("a", "b")))
# first_n should be a whole number or NULL
expect_error(ecb_data("abcde", "abc", first_n = "abc"))
expect_error(ecb_data("abcde", "abc", first_n = 1:2))
expect_error(ecb_data("abcde", "abc", first_n = TRUE))
expect_error(ecb_data("abcde", "abc", first_n = 1.5))
expect_error(ecb_data("abcde", "abc", first_n = -1L))
expect_error(ecb_data("abcde", "abc", first_n = 0L))
# last_n should be a whole number or NULL
expect_error(ecb_data("abcde", "abc", last_n = "abc"))
expect_error(ecb_data("abcde", "abc", last_n = TRUE))
expect_error(ecb_data("abcde", "abc", last_n = 1:2))
expect_error(ecb_data("abcde", "abc", last_n = 1.5))
expect_error(ecb_data("abcde", "abc", last_n = -1L))
expect_error(ecb_data("abcde", "abc", last_n = 0L))
# updated_after should be NULL, Date, POSIXct, or ISO 8601 string
expect_error(ecb_data("abcde", "abc", updated_after = 1L))
expect_error(ecb_data("abcde", "abc", updated_after = TRUE))
expect_error(ecb_data("abcde", "abc", updated_after = NA))
})
test_that("ecb_data passes updated_after as updatedAfter", {
captured = NULL
httr2::local_mocked_responses(function(req) {
captured <<- req
httr2::response(200L, headers = "content-type: application/xml", body = charToRaw("<x/>"))
})
local_mocked_bindings(parse_ecb_data = function(xml) data.table())
ecb_data("EXR", "D.USD.EUR.SP00.A", updated_after = as.Date("2024-06-01"))
expect_match(captured$url, "updatedAfter=2024-06-01T00%3A00%3A00Z")
})
test_that("parse_bbk_data works", {
body = xml2::read_xml(test_path("fixtures", "ecb-data.xml"))
actual = parse_ecb_data(body)
expect_data_table(actual, min.rows = 1L)
expect_identical(unique(actual$key), "D.USD.EUR.SP00.A")
expect_date(actual$date)
body = xml2::read_xml(test_path("fixtures", "ecb-data-fm.xml"))
actual = parse_ecb_data(body)
expect_data_table(actual, min.rows = 1L)
expect_gt(length(unique(actual$key)), 0L)
expect_date(actual$date)
})
test_that("parse_ecb_data drops observations without a value and keeps alignment", {
body = xml2::read_xml(
'<message:GenericData xmlns:message="m" xmlns:generic="http://generic">
<message:DataSet>
<generic:Series>
<generic:SeriesKey>
<generic:Value id="FREQ" value="M"/>
<generic:Value id="CURRENCY" value="USD"/>
</generic:SeriesKey>
<generic:Attributes><generic:Value id="TITLE_COMPL" value="t"/></generic:Attributes>
<generic:Obs><generic:ObsDimension value="2020-01"/><generic:ObsValue value="1"/></generic:Obs>
<generic:Obs><generic:ObsDimension value="2020-02"/></generic:Obs>
<generic:Obs><generic:ObsDimension value="2020-03"/><generic:ObsValue value="3"/></generic:Obs>
</generic:Series>
</message:DataSet>
</message:GenericData>'
)
actual = parse_ecb_data(body)
expect_identical(actual$date, as.Date(c("2020-01-01", "2020-03-01")))
expect_identical(actual$value, c(1, 3))
})
test_that("parse_ecb_data keeps annual dates intact in mixed-frequency results", {
body = xml2::read_xml(
'<message:GenericData xmlns:message="m" xmlns:generic="http://generic">
<message:DataSet>
<generic:Series>
<generic:SeriesKey>
<generic:Value id="FREQ" value="A"/>
<generic:Value id="CURRENCY" value="USD"/>
</generic:SeriesKey>
<generic:Obs><generic:ObsDimension value="2020"/><generic:ObsValue value="1.1"/></generic:Obs>
</generic:Series>
<generic:Series>
<generic:SeriesKey>
<generic:Value id="FREQ" value="M"/>
<generic:Value id="CURRENCY" value="USD"/>
</generic:SeriesKey>
<generic:Obs><generic:ObsDimension value="2020-03"/><generic:ObsValue value="1.2"/></generic:Obs>
</generic:Series>
</message:DataSet>
</message:GenericData>'
)
actual = parse_ecb_data(body)
expect_identical(actual$date, as.Date(c("2020-01-01", "2020-03-01")))
expect_identical(actual$freq, c("annual", "monthly"))
})
test_that("parse_ecb_data ignores observation level attributes", {
body = xml2::read_xml(
'<message:GenericData xmlns:message="m" xmlns:generic="http://generic">
<message:DataSet>
<generic:Series>
<generic:SeriesKey><generic:Value id="FREQ" value="D"/></generic:SeriesKey>
<generic:Obs>
<generic:ObsDimension value="2020-01-01"/><generic:ObsValue value="1"/>
<generic:Attributes><generic:Value id="OBS_STATUS" value="M"/></generic:Attributes>
</generic:Obs>
<generic:Obs>
<generic:ObsDimension value="2020-01-02"/><generic:ObsValue value="2"/>
<generic:Attributes><generic:Value id="OBS_STATUS" value="A"/></generic:Attributes>
</generic:Obs>
</generic:Series>
</message:DataSet>
</message:GenericData>'
)
actual = parse_ecb_data(body)
expect_identical(actual$value, c(1, 2))
expect_false("obs_status" %in% names(actual))
})
test_that("ecb_dimension input validation works", {
expect_error(ecb_dimension(1L))
expect_error(ecb_dimension(TRUE))
expect_error(ecb_dimension(NULL))
expect_error(ecb_dimension(c("a", "b")))
})
test_that("metadata input validation works", {
# type should be one of datastructure, dataflow, codelist, concept
expect_error(ecb_metadata(1L))
expect_error(ecb_metadata(TRUE))
expect_error(ecb_metadata(c("datastructure", "dataflow")))
expect_error(ecb_metadata("data"))
# id should be a character(1) or NULL
expect_error(ecb_metadata("datastructure", id = 1L))
expect_error(ecb_metadata("datastructure", id = TRUE))
expect_error(ecb_metadata("datastructure", id = c("a", "b")))
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.