tests/testthat/test-proxy-messages.R

# Test that proxy functions send correct messages through the session.
# We use a mock session that captures sendCustomMessage calls.

mock_session <- function() {
  env <- new.env(parent = emptyenv())
  env$messages <- list()
  env$sendCustomMessage <- function(type, message) {
    env$messages[[length(env$messages) + 1]] <- list(type = type, message = message)
  }
  env
}

make_proxy <- function() {
  session <- mock_session()
  proxy <- perspectiveProxy(session, "viewer1")
  list(proxy = proxy, session = session)
}

# ---- psp_update ----

test_that("psp_update sends update message with JSON", {
  p <- make_proxy()
  result <- psp_update(p$proxy, data.frame(x = 1:3))
  msgs <- p$session$messages
  expect_length(msgs, 1)
  expect_equal(msgs[[1]]$type, "perspective-calls")
  expect_equal(msgs[[1]]$message$id, "viewer1")
  expect_equal(msgs[[1]]$message$method, "update")
  expect_equal(msgs[[1]]$message$format, "json")
  expect_invisible(psp_update(p$proxy, data.frame(x = 1)))
})

test_that("psp_update validates proxy", {
  expect_error(psp_update("not_a_proxy", data.frame(x = 1)), "perspectiveProxy")
})

# ---- psp_replace ----

test_that("psp_replace sends replace message", {
  p <- make_proxy()
  psp_replace(p$proxy, data.frame(y = c("a", "b")))
  msgs <- p$session$messages
  expect_length(msgs, 1)
  expect_equal(msgs[[1]]$message$method, "replace")
  expect_equal(msgs[[1]]$message$format, "json")
})

test_that("psp_replace validates proxy", {
  expect_error(psp_replace("not_a_proxy", data.frame(x = 1)), "perspectiveProxy")
})

# ---- psp_clear ----

test_that("psp_clear sends clear message", {
  p <- make_proxy()
  psp_clear(p$proxy)
  msgs <- p$session$messages
  expect_length(msgs, 1)
  expect_equal(msgs[[1]]$message$method, "clear")
})

# ---- psp_reset ----

test_that("psp_reset sends reset message", {
  p <- make_proxy()
  psp_reset(p$proxy)
  msgs <- p$session$messages
  expect_length(msgs, 1)
  expect_equal(msgs[[1]]$message$method, "reset")
})

# ---- psp_restore ----

test_that("psp_restore sends restore message with config", {
  p <- make_proxy()
  cfg <- list(plugin = "Y Bar", group_by = list("cyl"))
  psp_restore(p$proxy, cfg)
  msgs <- p$session$messages
  expect_length(msgs, 1)
  expect_equal(msgs[[1]]$message$method, "restore")
  expect_equal(msgs[[1]]$message$config, cfg)
})

test_that("psp_restore validates proxy", {
  expect_error(psp_restore("not_a_proxy", list()), "perspectiveProxy")
})

# ---- psp_remove ----

test_that("psp_remove sends remove message with keys", {
  p <- make_proxy()
  psp_remove(p$proxy, keys = c("a", "b"))
  msgs <- p$session$messages
  expect_length(msgs, 1)
  expect_equal(msgs[[1]]$message$method, "remove")
  expect_equal(msgs[[1]]$message$keys, list("a", "b"))
})

# ---- psp_export ----

test_that("psp_export sends export message with format", {
  p <- make_proxy()
  psp_export(p$proxy, format = "csv")
  msgs <- p$session$messages
  expect_length(msgs, 1)
  expect_equal(msgs[[1]]$message$method, "export")
  expect_equal(msgs[[1]]$message$format, "csv")
})

test_that("psp_export sends windowed params", {
  p <- make_proxy()
  psp_export(p$proxy, format = "json", start_row = 0, end_row = 10,
             start_col = 0, end_col = 3)
  msg <- p$session$messages[[1]]$message
  expect_equal(msg$start_row, 0)
  expect_equal(msg$end_row, 10)
  expect_equal(msg$start_col, 0)
  expect_equal(msg$end_col, 3)
})

test_that("psp_export default format is json", {
  p <- make_proxy()
  psp_export(p$proxy)
  expect_equal(p$session$messages[[1]]$message$format, "json")
})

# ---- psp_save ----

test_that("psp_save sends save message", {
  p <- make_proxy()
  psp_save(p$proxy)
  msgs <- p$session$messages
  expect_length(msgs, 1)
  expect_equal(msgs[[1]]$message$method, "save")
})

# ---- psp_on_update ----

test_that("psp_on_update sends on_update message with enable flag", {
  p <- make_proxy()
  psp_on_update(p$proxy, enable = TRUE)
  expect_equal(p$session$messages[[1]]$message$method, "on_update")
  expect_true(p$session$messages[[1]]$message$enable)

  psp_on_update(p$proxy, enable = FALSE)
  expect_false(p$session$messages[[2]]$message$enable)
})

# ---- psp_schema ----

test_that("psp_schema sends schema message", {
  p <- make_proxy()
  psp_schema(p$proxy)
  expect_equal(p$session$messages[[1]]$message$method, "schema")
})

# ---- psp_size ----

test_that("psp_size sends size message", {
  p <- make_proxy()
  psp_size(p$proxy)
  expect_equal(p$session$messages[[1]]$message$method, "size")
})

# ---- psp_columns ----

test_that("psp_columns sends columns message", {
  p <- make_proxy()
  psp_columns(p$proxy)
  expect_equal(p$session$messages[[1]]$message$method, "columns")
})

# ---- psp_validate_expressions ----

test_that("psp_validate_expressions sends validate message", {
  p <- make_proxy()
  psp_validate_expressions(p$proxy, expressions = c('"col1" + "col2"'))
  msg <- p$session$messages[[1]]$message
  expect_equal(msg$method, "validate_expressions")
  expect_type(msg$expressions, "list")
})

# ---- chaining ----

test_that("proxy functions return proxy invisibly for chaining", {
  p <- make_proxy()
  expect_invisible(psp_clear(p$proxy))
  expect_invisible(psp_reset(p$proxy))
  expect_invisible(psp_save(p$proxy))
  expect_invisible(psp_on_update(p$proxy))
  expect_invisible(psp_schema(p$proxy))
  expect_invisible(psp_size(p$proxy))
  expect_invisible(psp_columns(p$proxy))

  ret <- psp_clear(p$proxy)
  expect_s3_class(ret, "perspective_proxy")
})

Try the perspectiveR package in your browser

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

perspectiveR documentation built on March 30, 2026, 9:06 a.m.