tests/testthat/test-topline_freqs.R

# Errors and Warnings -----------------------------------------------------

test_that("Error: multiple grouping variables", {
  dataset <- tibble::tibble(
    s_var = 1,
    m_var_1 = 1,
    m_var_2 = 2,
    m_var_3 = 3
  ) %>%
    dplyr::group_by(s_var, m_var_1)

  expect_error(
    topline_freqs(dataset, silently = TRUE),
    'Multiple grouping vars detected, only one grouping variable permitted. Detected grouping vars: s_var, m_var_1'
  )
})


test_that("Error: missing question types", {
  dataset <- tibble::tibble(
    s_var = 1,
    m_var_1 = 1,
    m_var_2 = NA_real_,
    m_var_3 = 1,
    n_var = 875
  )
  labelled::val_label(dataset$m_var_2, 1) <- 'empty'

  expect_error(
    dataset %>%
      dplyr::select(-s_var) %>%
      topline_freqs(silently = TRUE),
    regexp = NA
  )
  expect_error(
    dataset %>%
      dplyr::select(-m_var_1:-m_var_3) %>%
      topline_freqs(silently = TRUE),
    regexp = NA
  )
  expect_error(
    dataset %>%
      dplyr::select(-n_var) %>%
      topline_freqs(silently = TRUE),
    regexp = NA
  )
  expect_error(
    topline_freqs(dataset %>% dplyr::select(-dplyr::everything())),
    'You currently have no variables specified or no variables with proper y2 prefixes. Please either list out the variables you wish to include or check if your variables have the correct prefixes.'
  )
})


test_that("Error: missing variables", {
  dataset <- tibble::tibble(
    s_var = 1,
    m_var_1 = 1,
    m_var_2 = NA_real_,
    m_var_3 = 1,
    n_var = 875
  )
  expect_error(
    topline_freqs(dataset %>% dplyr::select(-dplyr::everything())),
    'You currently have no variables specified or no variables with proper y2 prefixes. Please either list out the variables you wish to include or check if your variables have the correct prefixes.'
  )

  dataset <- tibble::tibble(
    q_var = 1,
    xyz = 1,
    groups = NA_real_,
    vn_var = 1,
    weights = 875
  )
  expect_error(
    topline_freqs(dataset),
    'You currently have no variables specified or no variables with proper y2 prefixes. Please either list out the variables you wish to include or check if your variables have the correct prefixes.'
  )
})


test_that("Warning: missing labels for multiple selects", {
  dataset <- tibble::tibble(
    s_var = c(1, 2, 3, 2, NA_real_),
    m_var_1 = c(1, NA_real_, NA_real_, 1, 1),
    m_var_2 = c(NA_real_, NA_real_, 1, NA_real_, 1),
    n_var = c(0, 50, 100, 100, 100),
    groups = c('group 1', 'group 1', 'group 2', 'group 3', 'group 2')
  )
  labelled::val_label(dataset$m_var_1, 1) <- 'some1'
  dataset <- dataset %>% dplyr::group_by(groups)


  expect_warning(
    dataset %>% dplyr::ungroup() %>% topline_freqs(silently = TRUE),
    regexp = NA
  )
  expect_warning(
    dataset %>% dplyr::group_by(groups) %>% topline_freqs(silently = TRUE),
    'Not all multiple select variables have labels. Please ensure this is intended before continuing. When working with grouped data, results may be inaccurate for multiple select questions if they are not all labelled.'
  )

})



# Overall Tests ----------------------------------------------------------------

test_that("Pulls right variables", {
  dataset <- tibble::tibble(
    s_var = 1,
    m_var_1 = 1,
    m_var_2 = NA_real_,
    m_var_3 = 1,
    m_var_3_TEXT = 'Other text',
    oe_var = 'a lot of text',
    n_var = 875,
    r_var_1 = 1,
    r_var_2 = 2,
    r_var_3 = 3,
    md_var_1 = 1,
    md_var_2 = NA_real_,
    md_var_3 = 1,
    M_RACE_1 = 'white',
    M_RACE_2 = 'black',
    q1 = 1,
    weights = 2.1
  )
  labelled::val_label(dataset$m_var_2, 1) <- 'empty'
  labelled::val_label(dataset$md_var_2, 0) <- 'empty'

  vars_freqd <- topline_freqs(dataset, silently = TRUE) %>%
    dplyr::select(variable) %>%
    purrr::as_vector() %>%
    as.character()

  expect_equal(
    vars_freqd,
    c('s_var', 'm_var_1', 'm_var_2', 'm_var_3', 'n_var', 'r_var_1', 'r_var_2',
      'r_var_3', 'md_var_1', 'md_var_2', 'md_var_3', 'M_RACE_1', 'M_RACE_2')
  )
})


test_that("output formatting", {
  dataset <- tibble::tibble(
    s_var = 1,
    m_var_1 = 1,
    m_var_2 = NA_real_,
    m_var_3 = 1,
    n_var = 875
  )
  labelled::val_label(dataset$m_var_2, 1) <- 'empty'

  frequencies <- dataset %>% topline_freqs(silently = TRUE)

  expect_equal(
    class(frequencies),
    c('tbl_df', 'tbl', 'data.frame')
    )
  expect_equal(
    names(frequencies),
    c('variable', 'prompt', 'value', 'label', 'n', 'stat', 'result', 'base_ns')
  )
})


test_that("base_ns calculations", {
  dataset <- tibble::tibble(
    s_var = c(1, 2, NA_real_),
    m_var_1 = c(NA_real_, NA_real_, 1),
    m_var_2 = c(NA_real_, NA_real_, NA_real_),
    m_var_3 = c(1, NA_real_, NA_real_),
    n_var = c(0, 50, 75),
    weights = c(1, 2, 1)
  )
  frequencies <- dataset %>% topline_freqs(silently = TRUE)
  ns_s_var <- frequencies %>%
    dplyr::filter(variable == 's_var') %>%
    dplyr::pull(base_ns) %>%
    unique()
  ns_m_var <- frequencies %>%
    dplyr::filter(variable == 'm_var_1') %>%
    dplyr::pull(base_ns) %>%
    unique()
  ns_n_var <- frequencies %>%
    dplyr::filter(variable == 'n_var') %>%
    dplyr::pull(base_ns) %>%
    unique()

  expect_equal(ns_s_var, 2)
  expect_equal(ns_m_var, 2)
  expect_equal(ns_n_var, 3)
})


test_that("grouped topline", {
  dataset <- tibble::tibble(
    s_var = c(1, 2, 3, 2, NA_real_),
    m_var_1 = c(1, NA_real_, NA_real_, 1, 1),
    m_var_2 = c(NA_real_, NA_real_, 1, NA_real_, 1),
    n_var = c(0, 50, 100, 100, 100),
    groups = c('group 1', 'group 1', 'group 2', 'group 3', 'group 2')
  )
  labelled::val_label(dataset$m_var_1, 1) <- 'some1'
  labelled::val_label(dataset$m_var_2, 1) <- 'some2'
  dataset <- dataset %>% dplyr::group_by(groups)
  frequencies <- dataset %>% topline_freqs(silently = TRUE)

  expect_equal(
    names(frequencies),
    c('variable', 'prompt', 'value', 'label', 'stat', 'n group 1',
      'result group 1', 'n group 2', 'result group 2', 'n group 3',
      'result group 3', 'base_ns group 1', 'base_ns group 2', 'base_ns group 3'
      )
  )

  base_ns_s_var <- frequencies %>%
    dplyr::filter(variable == 's_var') %>%
    dplyr::pull(`base_ns group 2`) %>%
    unique()
  base_ns_m_var <- frequencies %>%
    dplyr::filter(variable == 'm_var_1') %>%
    dplyr::pull(`base_ns group 3`) %>%
    unique()
  ns_s_var <- frequencies %>%
    dplyr::filter(variable == 's_var') %>%
    dplyr::pull(`n group 1`)
  result_m_var <- frequencies %>%
    dplyr::filter(variable == 'm_var_1') %>%
    dplyr::pull(`result group 2`) %>%
    unique()

  expect_equal(base_ns_s_var, 1)
  expect_equal(base_ns_m_var, 1)
  expect_equal(ns_s_var, c(1, 1))
  expect_equal(result_m_var, .5)
})


test_that("grouped topline, missing question types", {
  dataset <- tibble::tibble(
    s_var = c(1, 2, 3, 2),
    m_var_1 = c(1, NA_real_, 1, 1),
    n_var = c(0, 50, 100, 100),
    groups = c('group 1', 'group 2', 'group 3', 'group 2')
  )
  labelled::val_label(dataset$m_var_1, 1) <- 'some1'
  dataset <- dataset %>% dplyr::group_by(groups)

  expect_error(
    dataset %>%
      dplyr::select(-s_var) %>%
      topline_freqs(silently = TRUE),
    regexp = NA
  )
  expect_error(
    dataset %>%
      dplyr::select(-m_var_1) %>%
      topline_freqs(silently = TRUE),
    regexp = NA
  )
  expect_error(
    dataset %>%
      dplyr::select(-m_var_1) %>%
      topline_freqs(),
    regexp = NA
  )
  expect_error(
    dataset %>%
      dplyr::select(-n_var) %>%
      topline_freqs(silently = TRUE),
    regexp = NA
  )
})


# Argument Tests (in order of documentation) -----------------------------------

test_that("weight_var argument", {
  dataset <- tibble::tibble(
    s_var = c(1, 2),
    m_var_1 = c(1, NA_real_),
    m_var_2 = c(1, NA_real_),
    n_var = c(0, 50),
    weights = c(1, 2)
  )
  frequencies_unweighted <- topline_freqs(
    dataset,
    silently = TRUE
  )
  frequencies_weighted <- topline_freqs(
    dataset,
    silently = TRUE,
    weight_var = weights
  )

  expect_equal(frequencies_unweighted$result[1], .5)
  expect_equal(frequencies_unweighted$result[5], 25)

  expect_equal(frequencies_weighted$result[1], .33)
  expect_equal(frequencies_weighted$result[5], 33.33)

  expect_equal(
    stringr::str_detect(frequencies_weighted$variable, 'weights') %>% sum,
    0
  )
  expect_equal(
    stringr::str_detect(frequencies_unweighted$variable, 'weights') %>% sum,
    0
  )
})


test_that("assign_s argument", {
  dataset <- tibble::tibble(
    s_var = c(1, 2),
    m_var_1 = c(1, NA_real_),
    m_var_2 = c(NA_real_, NA_real_),
    q1_1 = c(1, 1),
    q1_2 = c(1, 1)
  )
  frequencies <- topline_freqs(
    dataset,
    assign_s = 'q1_1',
    silently = TRUE
  )

  expect_equal(
    stringr::str_detect(frequencies$variable, 'q1_1') %>% sum(),
    1
  )
  expect_equal(
    stringr::str_detect(frequencies$variable, 'q1_2') %>% sum(),
    0
  )
})


test_that("assign_m argument", {
  dataset <- tibble::tibble(
    s_var = c(1, 2),
    m_var_1 = c(1, NA_real_),
    m_var_2 = c(NA_real_, NA_real_),
    q1_1 = c(1, 1),
    q1_2 = c(1, 1)
  )
  frequencies <- topline_freqs(
    dataset,
    assign_m = c('q1_1', 'q1_2'),
    silently = TRUE
  )

  expect_equal(
    stringr::str_detect(frequencies$variable, 'q1_1') %>% sum(),
    1
  )
  expect_equal(
    stringr::str_detect(frequencies$variable, 'q1_2') %>% sum(),
    1
  )
})


test_that("assign_n argument", {
  dataset <- tibble::tibble(
    s_var = c(1, 2),
    m_var_1 = c(1, NA_real_),
    m_var_2 = c(NA_real_, NA_real_),
    q1 = c(0, 50)
  )
  frequencies <- topline_freqs(
    dataset,
    assign_n = 'q1',
    silently = TRUE
  )

  expect_equal(
    frequencies$result[4],
    25.0
  )
  expect_equal(
    frequencies$stat[4],
    'mean'
  )
})


test_that("messages, silently argument", {
  dataset <- tibble::tibble(
    s_var = 1,
    m_var_1 = 1,
    m_var_2 = 2,
    m_var_3 = 3
  )
  dataset2 <- tibble::tibble(
    s_var = 1,
    q1_var = 2,
    m_var_1 = 1,
    m_var_2 = 1
  )

  expect_message(
    topline_freqs(dataset, silently = TRUE),
    NA
  )
  expect_message(
    topline_freqs(dataset),
    "Variable stem \"m_var\" successfully freq'd"
  )
  expect_message(
    topline_freqs(dataset2),
    "In addition to standard Qualtrics variables, the following variables from your dataset were not included in the topline:\nq1_var"
  )
})


test_that("unweighted_ns argument", {
  dataset <- tibble::tibble(
    s_var = c(1, 2),
    m_var_1 = c(1, NA_real_),
    m_var_2 = c(1, NA_real_),
    n_var = c(0, 50),
    weights = c(1, 2)
  )
  frequencies_unweighted <- topline_freqs(
    dataset,
    silently = TRUE
  )
  frequencies_weighted <- topline_freqs(
    dataset,
    silently = TRUE,
    weight_var = weights
  )
  frequencies_weighted_weightedns <- topline_freqs(
    dataset,
    silently = TRUE,
    weight_var = weights,
    unweighted_ns = FALSE
  )

  expect_equal(frequencies_unweighted$n[1], 1)
  expect_equal(frequencies_unweighted$n[5], 2)

  expect_equal(frequencies_weighted$n[2], 1)
  expect_equal(frequencies_weighted$n[5], 2)

  expect_equal(frequencies_weighted_weightedns$n[2], 2)
  expect_equal(frequencies_weighted_weightedns$n[5], 3)
})
nick-moffitt/y2municipal documentation built on Dec. 20, 2024, 5:53 a.m.