mirror of
https://github.com/rstudio/shiny.git
synced 2026-01-11 07:58:11 -05:00
190 lines
5.7 KiB
R
190 lines
5.7 KiB
R
test_that("Shared secret", {
|
|
op <- options(shiny.sharedSecret = "This is a secret string")
|
|
on.exit(options(op))
|
|
|
|
checkSharedSecret <- loadSharedSecret()
|
|
|
|
expect_true(checkSharedSecret("This is a secret string"))
|
|
expect_true(checkSharedSecret(charToRaw("This is a secret string")))
|
|
|
|
expect_false(checkSharedSecret("this is a secret string"))
|
|
expect_false(checkSharedSecret("This is a secret string "))
|
|
expect_false(checkSharedSecret(""))
|
|
expect_false(checkSharedSecret(NULL))
|
|
expect_error(checkSharedSecret(1:10))
|
|
})
|
|
|
|
test_that("Captured options contain expected elements", {
|
|
old_options <- shinyOptions(); on.exit(do.call(shinyOptions, old_options))
|
|
|
|
shinyOptions(bookmarkStore = 123)
|
|
shinyOptions(appDir = normalizePath("../")) # stomped
|
|
caps <- captureAppOptions()
|
|
|
|
expect_equal(sort(names(caps)), c("appDir", "bookmarkStore"))
|
|
expect_equal(caps$appDir, getwd())
|
|
expect_equal(caps$bookmarkStore, 123)
|
|
|
|
# verify that options are reset
|
|
expect_equal(getShinyOption("bookmarkStore"), NULL)
|
|
expect_equal(getShinyOption("appDir"), NULL)
|
|
})
|
|
|
|
test_that("Capturing options at creation time", {
|
|
old_options <- shinyOptions(); on.exit(do.call(shinyOptions, old_options))
|
|
|
|
# These are tests of captureAppOptions. Specific options should be captured
|
|
# and stored at app creation time and immediately reset. If another app is
|
|
# created, it will also capture these options at creation time.
|
|
# When these apps are started, they will apply the options.
|
|
shinyOptions(bookmarkStore = 123)
|
|
value <- NULL
|
|
s <- shinyApp(basicPage(), function(input, output) {},
|
|
onStart = function() {
|
|
value <<- getShinyOption("bookmarkStore")
|
|
observe(stopApp())
|
|
}
|
|
)
|
|
# After creating app, bookmarkStore option should be reset
|
|
expect_identical(getShinyOption("bookmarkStore"), NULL)
|
|
expect_identical(value, NULL)
|
|
|
|
# Create another app
|
|
shinyOptions(bookmarkStore = 456)
|
|
value2 <- NULL
|
|
s2 <- shinyApp(basicPage(), function(input, output) {},
|
|
onStart = function() {
|
|
value2 <<- getShinyOption("bookmarkStore")
|
|
observe(stopApp())
|
|
}
|
|
)
|
|
expect_identical(getShinyOption("bookmarkStore"), NULL)
|
|
expect_identical(value2, NULL)
|
|
|
|
# Running second app will cause the option to be restored while it's running,
|
|
# and in our onStart, we save it into value2.
|
|
runApp(s2, launch.browser = FALSE, quiet = TRUE)
|
|
expect_identical(value, NULL)
|
|
expect_identical(value2, 456)
|
|
expect_identical(getShinyOption("bookmarkStore"), NULL)
|
|
|
|
# Same, for first app and value1.
|
|
runApp(s, launch.browser = FALSE, quiet = TRUE)
|
|
expect_identical(value, 123)
|
|
expect_identical(value2, 456)
|
|
expect_identical(getShinyOption("bookmarkStore"), NULL)
|
|
})
|
|
|
|
|
|
test_that("Option scoping", {
|
|
old_options <- shinyOptions(); on.exit(do.call(shinyOptions, old_options))
|
|
# Tests for global and app-level scoping for shinyOptions().
|
|
shinyOptions(foo = NULL)
|
|
values <- list()
|
|
values["global_in"] <- list(getShinyOption("foo"))
|
|
shinyOptions(foo = "global")
|
|
|
|
s <- shinyApp(
|
|
basicPage(),
|
|
function(input, output, session) {},
|
|
onStart = function() {
|
|
values["app_in"] <<- list(getShinyOption("foo"))
|
|
|
|
shinyOptions(foo = "app")
|
|
|
|
onStop(function() {
|
|
values["app_out"] <<- list(getShinyOption("foo"))
|
|
})
|
|
observe(stopApp())
|
|
}
|
|
)
|
|
|
|
# Run the app
|
|
runApp(s, launch.browser = FALSE, quiet = TRUE)
|
|
values["global_out"] <- list(getShinyOption("foo"))
|
|
|
|
expect_identical(
|
|
values,
|
|
list(
|
|
global_in = NULL,
|
|
app_in = "global",
|
|
app_out = "app",
|
|
global_out = "global"
|
|
)
|
|
)
|
|
|
|
# Note: The code below also tests for session-level scoping of shinyOptions(),
|
|
# but it can't be easily run in CI, since it requires a browser to connect to
|
|
# the app to run the session-level code.
|
|
#
|
|
# # Tests for global, app, and session-level scoping for shinyOptions().
|
|
# shinyOptions(foo = NULL)
|
|
# values <- list()
|
|
# values["global_in"] <- list(getShinyOption("foo"))
|
|
# shinyOptions(foo = "global")
|
|
#
|
|
# s <- shinyApp(
|
|
# basicPage(),
|
|
# function(input, output, session) {
|
|
# values["session_in"] <<- list(getShinyOption("foo"))
|
|
# shinyOptions(foo = "session")
|
|
# onStop(function() {
|
|
# values["session_out"] <<- list(getShinyOption("foo"))
|
|
# })
|
|
#
|
|
# observe(stopApp())
|
|
# },
|
|
# onStart = function() {
|
|
# values["app_in"] <<- list(getShinyOption("foo"))
|
|
#
|
|
# shinyOptions(foo = "app")
|
|
#
|
|
# onStop(function() {
|
|
# values["app_out"] <<- list(getShinyOption("foo"))
|
|
# })
|
|
# }
|
|
# )
|
|
#
|
|
# # Run the app
|
|
# runApp(s)
|
|
# # Need this to run the session's onStop callbacks. But this should happen
|
|
# # automatically, without needing to pump the event loop an extra time.
|
|
# later::run_now()
|
|
# values["global_out"] <- list(getShinyOption("foo"))
|
|
#
|
|
# expect_identical(
|
|
# values,
|
|
# list(
|
|
# global_in = NULL,
|
|
# app_in = "global",
|
|
# session_in = "app",
|
|
# app_out = "app",
|
|
# # TODO: It would be more correct if session_out came before app_out,
|
|
# # because it makes more sense for the session's onStop callback to run
|
|
# # before the app's onStop. But that can be revisited at some point in the
|
|
# # future.
|
|
# session_out = "session",
|
|
# global_out = "global"
|
|
# )
|
|
# )
|
|
|
|
})
|
|
|
|
test_that("Unsetting app-level option NULL won't affect global option", {
|
|
old_options <- shinyOptions(); on.exit(do.call(shinyOptions, old_options))
|
|
|
|
shinyOptions(foo = 1)
|
|
value <- NULL
|
|
s <- shinyApp(basicPage(), function(input, output) {},
|
|
onStart = function() {
|
|
shinyOptions(foo = NULL)
|
|
value <<- getShinyOption("foo")
|
|
observe(stopApp())
|
|
}
|
|
)
|
|
|
|
runApp(s, launch.browser = FALSE, quiet = TRUE)
|
|
expect_identical(getShinyOption("foo"), 1)
|
|
expect_identical(value, NULL)
|
|
})
|