context("dropdown") test_that("test dropdown_input", { # type expect_is(dropdown_input("a", c(1,2,3)), "shiny.tag") # wrong input expect_error(dropdown_input("a"), "argument \"choices\" is missing, with no default") # simple input si_str <- as.character(dropdown_input("a", c(1,2,3))) expect_true(any(grepl("
1
", si_str, fixed = TRUE))) expect_true(any(grepl("
2
", si_str, fixed = TRUE))) expect_true(any(grepl("
3
", si_str, fixed = TRUE))) expect_false(any(grepl("
0
", si_str, fixed = TRUE))) }) init_driver <- function(app) { shinytest2::AppDriver$new(app) } test_app <- function(value, initial, multiple, choices = NULL) { type <- if (multiple) "multiple" else "" shiny::shinyApp( ui = semanticPage( dropdown_input("dropdown", LETTERS, value = initial, type = type), shiny::actionButton("trigger", "Trigger") ), server = function(input, output, session) { shiny::observeEvent(input$trigger, { update_dropdown_input(session, "dropdown", value = value, choices = choices) }) } ) } describe("update_dropdown_input", { skip_on_cran() local_edition(3) it("is a no-op with NULL value", { # Arrange initial_value <- "A" app <- init_driver(test_app(value = NULL, initial = initial_value, multiple = FALSE)) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), initial_value ) }) it("is a no-op with a value not in choices", { # Arrange initial_value <- "A" app <- init_driver(test_app(value = "asdf", initial = initial_value, multiple = FALSE)) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), initial_value ) }) it("updates a single-selection dropdown with a new value", { # Arrange value <- "A" app <- init_driver(test_app(value = value, initial = NULL, multiple = FALSE)) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), value ) }) it("updates a multi-selection dropdown with new values", { # Arrange value <- c("A", "B") app <- init_driver(test_app(value = value, initial = NULL, multiple = TRUE)) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), value ) }) it("clears a single-selection dropdown with \"\" (empty string)", { # Arrange app <- init_driver(test_app(value = "", initial = "A", multiple = FALSE)) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), "" ) }) it("clears a multi-selection dropdown with \"\" (empty string)", { # Arrange app <- init_driver(test_app(value = "", initial = "A", multiple = TRUE)) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_null( app$get_value(input = "dropdown") ) }) it("clears a single-selection dropdown with character(0)", { # Arrange app <- init_driver(test_app(value = character(0), initial = "A", multiple = FALSE)) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), "" ) }) it("clears a multi-selection dropdown with character(0)", { # Arrange app <- init_driver(test_app(value = character(0), initial = "A", multiple = TRUE)) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_null( app$get_value(input = "dropdown") ) }) it("updates choices and clears selection in a single-selection dropdown when provided with choices and a NULL value", { # Arrange app <- init_driver(test_app(value = NULL, initial = "abc", multiple = FALSE, choices = c("abc", "xyz"))) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), "" ) }) it("updates choices and clears selection in a multi-selection dropdown when provided with choices and a NULL value", { # Arrange app <- init_driver(test_app(value = NULL, initial = "abc", multiple = TRUE, choices = c("abc", "xyz"))) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_null( app$get_value(input = "dropdown") ) }) it("updates choices and sets selection in a single-selection dropdown when provided with both choices and a value", { # Arrange value <- "xyz" app <- init_driver(test_app(value = value, initial = NULL, multiple = FALSE, choices = c("abc", "xyz"))) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), value ) }) it("updates choices and sets selection in a multi-selection dropdown when provided with both choices and a value", { # Arrange value <- c("abc", "xyz") app <- init_driver(test_app(value = value, initial = NULL, multiple = TRUE, choices = c("abc", "xyz"))) withr::defer(app$stop()) # Act app$click("trigger") # Assert expect_equal( app$get_value(input = "dropdown"), value ) }) })