tests/testthat/test-add-array.R

context("Add an array variable to a dataset")

test_that("POSTNewVariable rejects invalid categories", {
    expect_error(
        POSTNewVariable(
            "",
            list(
                type = "categorical", name = "bad names",
                categories = list(
                    list(id = 1L, name = "Name 1", numeric_value = 1L, missing = FALSE),
                    list(id = 2L, name = "Name 1", numeric_value = 2L, missing = FALSE),
                    list(id = -1L, name = "No Data", numeric_value = NULL, missing = TRUE)
                )
            )
        ),
        "Invalid category names: must be unique"
    )
})

test_that("POSTNewVariable rejects invalid categories in subvariable", {
    expect_error(
        POSTNewVariable(
            "",
            list(
                type = "categorical_array", name = "bad names",
                subvariables = list(list(
                    values = 1,
                    categories = list(
                        list(id = 1L, name = "Name 1", numeric_value = 1L, missing = FALSE),
                        list(id = 2L, name = "Name 1", numeric_value = 2L, missing = FALSE),
                        list(id = -1L, name = "No Data", numeric_value = NULL, missing = TRUE)
                    )
                ))
            )
        ),
        "Invalid category names: must be unique"
    )
})

test_that("POSTNewVariable validates that arrays have subvariables", {
    expect_error(
        POSTNewVariable("", list(type = "categorical_array")),
        "Cannot create array variable without specifying subvariables"
    )
})

with_test_authentication({
    ca.values <- mrdf[c(2, 1, 3)]
    ca.values[] <- lapply(ca.values, as.factor)
    ca.var <- list(
        name = "Categorical array",
        alias = "categoricalArray",
        description = "Here are some variables. They go together.",
        type = "categorical_array",
        subvariables = lapply(
            names(ca.values),
            function(x) toVariable(ca.values[[x]], name = x, alias = x)
        )
    )
    test_that("addVariables that are categorical_array over subvariable defs", {
        with(test.dataset(), {
            POSTNewVariable(variableCatalogURL(ds), ca.var)
            ds <- refresh(ds)
            expect_true(is.CA(ds$categoricalArray))
            expect_identical(
                description(ds$categoricalArray),
                "Here are some variables. They go together."
            )
            expect_identical(as.vector(ds$categoricalArray), ca.values)
            expect_identical(
                names(subvariables(ds$categoricalArray)),
                c("mr_2", "mr_1", "mr_3")
            )
        })
    })
    test_that("Adding an array as a single definition", {
        c2 <- ca.var
        c2$categories <- c2$subvariables[[1]]$categories
        c2$values <- matrix(unlist(lapply(
            c2$subvariables,
            vget("values")
        )), ncol = 3, nrow = 4, byrow = FALSE)
        c2$subvariables <- lapply(c2$subvariables, function(x) {
            x[!(names(x) %in% c("type", "categories", "values"))]
        })
        with(test.dataset(), {
            try(POSTNewVariable(variableCatalogURL(ds), c2))
            ds <- refresh(ds)
            expect_true(is.CA(ds$categoricalArray))
            expect_identical(
                description(ds$categoricalArray),
                "Here are some variables. They go together."
            )
            expect_identical(as.vector(ds$categoricalArray), ca.values)
        })
    })
    test_that("addVariables that are multiple_response", {
        with(test.dataset(), {
            newvar <- ca.var
            newvar$type <- "multiple_response"
            newvar$alias <- "multipleResponse"
            newvar$subvariables <- lapply(newvar$subvariables, function(x) {
                x$categories[[1]]$selected <- TRUE
                return(x)
            })
            class(newvar) <- "VariableDefinition"
            ds <- addVariables(ds, newvar)
            expect_true(is.MR(ds$multipleResponse))
        })
    })
})

Try the crunch package in your browser

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

crunch documentation built on Aug. 31, 2023, 1:07 a.m.