test_that("wa_button requires input_id", { expect_error( shiny.webawesome:::wa_button(), 'argument "input_id" is missing', fixed = TRUE ) }) test_that("wa_button defaults render the minimal action wrapper", { expect_exact_html( render_html( shiny.webawesome:::wa_button("button", "Run") ), c('Run') ) }) test_that("wa_button override render includes attrs and slots", { expect_exact_html( render_html( shiny.webawesome:::wa_button( "button", "Run", disabled = TRUE, appearance = "filled", loading = TRUE, size = "small", title = "Launch", type = "submit", variant = "brand", with_caret = TRUE, end = "After", start = "Before" ) ), c( paste0( '" ), " Run", ' After', ' Before', "" ) ) }) test_that("wa_button includes package-level class and style attrs", { expect_exact_html( render_html( shiny.webawesome:::wa_button( "button", "Run", class = "wa-gap-s button-shell", style = "margin-inline: 1rem;" ) ), c( paste0( 'Run' ) ) ) }) test_that("wa_button boolean args validate and render correctly", { boolean_args <- c( disabled = "disabled", formnovalidate = "formnovalidate", loading = "loading", pill = "pill", with_caret = "with-caret" ) default_html <- render_html(shiny.webawesome:::wa_button("button", "Run")) for (arg_name in names(boolean_args)) { attr_name <- boolean_args[[arg_name]] true_tag <- do.call( shiny.webawesome:::wa_button, c( list(input_id = "button", "Run"), stats::setNames(list(TRUE), arg_name) ) ) expect_exact_html( render_html(true_tag), c(sprintf('Run', attr_name)) ) false_tag <- do.call( shiny.webawesome:::wa_button, c( list(input_id = "button", "Run"), stats::setNames(list(FALSE), arg_name) ) ) expect_equal(render_html(false_tag), default_html) null_tag <- do.call( shiny.webawesome:::wa_button, c( list(input_id = "button", "Run"), stats::setNames(list(NULL), arg_name) ) ) expect_equal(render_html(null_tag), default_html) expect_error( do.call( shiny.webawesome:::wa_button, c( list(input_id = "button", "Run"), stats::setNames(list("yes"), arg_name) ) ), sprintf("`%s` must be TRUE, FALSE, or NULL.", arg_name), fixed = TRUE ) } }) test_that("wa_button enum arguments validate exactly", { enum_cases <- list( list( arg = "appearance", attr = "appearance", valid = "plain", invalid = "invalid" ), list( arg = "formenctype", attr = "formenctype", valid = "text/plain", invalid = "bad/type" ), list( arg = "formmethod", attr = "formmethod", valid = "post", invalid = "patch" ), list(arg = "size", attr = "size", valid = "large", invalid = "tiny"), list(arg = "target", attr = "target", valid = "_blank", invalid = "_new"), list(arg = "type", attr = "type", valid = "reset", invalid = "menu"), list(arg = "variant", attr = "variant", valid = "warning", invalid = "info") ) for (case in enum_cases) { valid_tag <- do.call( shiny.webawesome:::wa_button, c( list(input_id = "button", "Run"), stats::setNames(list(case$valid), case$arg) ) ) expect_exact_html( render_html(valid_tag), c( sprintf( 'Run', case$attr, case$valid ) ) ) expect_error( do.call( shiny.webawesome:::wa_button, c( list(input_id = "button", "Run"), stats::setNames(list(case$invalid), case$arg) ) ), sprintf("`%s` must be one of ", case$arg), fixed = TRUE ) } })