test_that("wa_select requires input_id", {
expect_error(
shiny.webawesome:::wa_select(),
'argument "input_id" is missing',
fixed = TRUE
)
})
test_that("wa_select defaults render the minimal semantic wrapper", {
option_tag <- make_wa_option("a", "A")
expect_exact_html(
render_html(
shiny.webawesome:::wa_select("select", option_tag)
),
c(
'',
' A',
""
)
)
})
test_that("wa_select override render includes attrs and slots", {
option_tag <- make_wa_option("a", "A")
expect_exact_html(
render_html(
shiny.webawesome:::wa_select(
"select",
option_tag,
disabled = TRUE,
label = "Pick one",
appearance = "filled",
multiple = TRUE,
open = TRUE,
pill = TRUE,
placeholder = "Select one",
placement = "top",
required = TRUE,
size = "large",
with_clear = TRUE,
clear_icon = "Clear",
end = "End",
label_slot = "Label slot",
start = "Start"
)
),
c(
paste0(
''
),
' A',
' Clear',
' End',
' Label slot',
' Start',
""
)
)
})
test_that("wa_select boolean args validate and render correctly", {
option_tag <- make_wa_option("a", "A")
boolean_args <- c(
disabled = "disabled",
multiple = "multiple",
open = "open",
pill = "pill",
required = "required",
with_clear = "with-clear"
)
default_html <- render_html(
shiny.webawesome:::wa_select("select", option_tag)
)
for (arg_name in names(boolean_args)) {
attr_name <- boolean_args[[arg_name]]
true_tag <- do.call(
shiny.webawesome:::wa_select,
c(
list(input_id = "select", option_tag),
stats::setNames(list(TRUE), arg_name)
)
)
expect_exact_html(
render_html(true_tag),
c(
sprintf('', attr_name),
' A',
""
)
)
false_tag <- do.call(
shiny.webawesome:::wa_select,
c(
list(input_id = "select", option_tag),
stats::setNames(list(FALSE), arg_name)
)
)
expect_equal(render_html(false_tag), default_html)
null_tag <- do.call(
shiny.webawesome:::wa_select,
c(
list(input_id = "select", option_tag),
stats::setNames(list(NULL), arg_name)
)
)
expect_equal(render_html(null_tag), default_html)
expect_error(
do.call(
shiny.webawesome:::wa_select,
c(
list(input_id = "select", option_tag),
stats::setNames(list("yes"), arg_name)
)
),
sprintf("`%s` must be TRUE, FALSE, or NULL.", arg_name),
fixed = TRUE
)
}
})
test_that("wa_select enum arguments validate exactly", {
option_tag <- make_wa_option("a", "A")
enum_cases <- list(
list(
arg = "appearance",
attr = "appearance",
valid = "outlined",
invalid = "glass"
),
list(
arg = "placement",
attr = "placement",
valid = "bottom",
invalid = "left"
),
list(arg = "size", attr = "size", valid = "small", invalid = "tiny")
)
for (case in enum_cases) {
valid_tag <- do.call(
shiny.webawesome:::wa_select,
c(
list(input_id = "select", option_tag),
stats::setNames(list(case$valid), case$arg)
)
)
expect_exact_html(
render_html(valid_tag),
c(
sprintf('', case$attr, case$valid),
' A',
""
)
)
expect_error(
do.call(
shiny.webawesome:::wa_select,
c(
list(input_id = "select", option_tag),
stats::setNames(list(case$invalid), case$arg)
)
),
sprintf("`%s` must be one of ", case$arg),
fixed = TRUE
)
}
})
test_that("update_wa_select sends only non-null values", {
recorder <- new_message_recorder()
expect_invisible(
shiny.webawesome:::update_wa_select(
session = recorder$session,
input_id = "sel",
value = "a",
label = NULL,
hint = "Help",
disabled = TRUE
)
)
expect_equal(
recorder$seen$calls,
list(
list(
input_id = "sel",
message = list(value = "a", hint = "Help", disabled = TRUE)
)
)
)
})
test_that("update_wa_select skips sendInputMessage for all-NULL updates", {
recorder <- new_message_recorder()
expect_invisible(
shiny.webawesome:::update_wa_select(
session = recorder$session,
input_id = "sel",
value = NULL,
label = NULL,
hint = NULL,
disabled = NULL
)
)
expect_equal(recorder$seen$calls, list())
})