tests/testthat/test-ui.R

library(testthat)
library(shiny)
library(shinytest)

if (shinytest::dependenciesInstalled()) {
  options(shiny.testmode = TRUE)

  # Init shiny driver for testing
  get_app <- function(app_name = "test_app") {
    app <- ShinyDriver$new(system.file("shiny-examples", app_name, package = "shinyauthr"))
    return(app)
  }

  # Steps to authenthicate user
  app_login <- function(app, role = "admin") {
    app$setInputs(`login-password` = if (role == "admin") "pass1" else "pass2")
    app$setInputs(`login-user_name` = if (role == "admin") "user1" else "user2")
    app$setInputs(`login-button` = "click")
    Sys.sleep(1) # wait for UI elements to load/update
  }

  app_logout <- function(app) {
    app$setInputs(`logout-button` = "click")
    Sys.sleep(1)
  }

  test_login_logout <- function(app_name = "test_app", desc) {
    test_that(desc, {
      # Don't run these tests on the CRAN build servers
      skip_on_cran()
      app <- get_app(app_name = app_name)
      Sys.sleep(1)
      login_panel <- app$findElement(xpath = "//*[@id='login-panel']")
      logout_button <- app$findElement(xpath = "//button[@id='logout-button']")
      # check login panel is shown on start-up
      testthat::expect_equal(login_panel$getCssValue("display"), "block")
      # check logout button is hidden on start-up
      testthat::expect_equal(logout_button$getCssValue("display"), "none")
      # login
      app_login(app)
      # check login panel is hidden after login
      testthat::expect_equal(login_panel$getCssValue("display"), "none")
      # check logout button is shown after login
      testthat::expect_equal(logout_button$getCssValue("display"), "inline-block")
      # logout
      app_logout(app)
      # check login panel is shown again after logout
      testthat::expect_equal(login_panel$getCssValue("display"), "block")
      # check logout button is hidden again after logout
      testthat::expect_equal(logout_button$getCssValue("display"), "none")
      # check pwd input does not contain previously entered pwd after logout
      pwd_input <- app$findElement(xpath = "//input[@id='login-password']")
      testthat::expect_equal(pwd_input$getText(), "")
    })
  }

  # test login and logout ===================
  test_login_logout(
    app_name = "test_app", 
    "UI changes accordingly with login and logout"
  )
  
  # test login and logout on now deprecated server functions ===================
  test_login_logout(
    app_name = "old_server_functions",
    "UI changes accordingly with deprecated login and logout server functions"
  )

  # test cookie logins ===================
  # this test passes locally and on most CI platforms
  # but is failing on macOS-latest. I think it is a shinytest issue.
  # removing for now.
  
  # test_that("cookie login works after app refresh", {
  #   # Don't run these tests on the CRAN build servers
  #   skip_on_cran()
  #   app_login(app, role = "user")
  #   app$refresh()
  #   Sys.sleep(3)
  #   login_panel <- app$findElement(xpath = "//*[@id='login-panel']")
  #   logout_button <- app$findElement(xpath = "//button[@id='logout-button']")
  #   # check login panel is hidden after refresh + cookie login
  #   testthat::expect_equal(login_panel$getCssValue("display"), "none")
  #   # check logout button is shown after refresh + cookie login
  #   testthat::expect_equal(logout_button$getCssValue("display"), "inline-block")
  # })

}

Try the shinyauthr package in your browser

Any scripts or data that you put into this service are public.

shinyauthr documentation built on July 20, 2021, 9:07 a.m.