tests/testthat/test-serializers.R

test_that("register_serializer registers a serializer correctly", {
  # Create a mock serializer function
  mock_serializer <- function() {
    function(x) paste0("mock:", x)
  }

  # Register the serializer
  register_serializer("mock", mock_serializer, "text/mock")

  # Check if it's registered correctly
  serializers <- show_registered_serializers()
  expect_true("mock" %in% serializers$name)
  expect_equal(serializers$mime_type[serializers$name == "mock"], "text/mock")

  # Check error conditions
  expect_snapshot(
    register_serializer("mock/invalid", mock_serializer, "text/mock"),
    error = TRUE
  )
  expect_snapshot(
    register_serializer("...", mock_serializer, "text/mock"),
    error = TRUE
  )
  expect_snapshot(
    register_serializer("none", mock_serializer, "text/mock"),
    error = TRUE
  )
})

test_that("show_registered_serializers returns correct format", {
  result <- show_registered_serializers()

  # Check structure
  expect_s3_class(result, "data.frame")
  expect_true(all(
    c("name", "mime_type", "graphic", "default") %in% names(result)
  ))

  # Check content
  expect_true("json" %in% result$name)
  expect_true("application/json" %in% result$mime_type)
})

test_that("get_serializers returns correct serializers", {
  # Default serializers
  serializers <- get_serializers()
  expect_type(serializers, "list")
  expect_true(all(vapply(serializers, is.function, logical(1))))

  # Named serializers
  json_serializer <- get_serializers("json")
  expect_length(json_serializer, 1)
  expect_equal(names(json_serializer), "application/json")

  # Multiple serializers
  multi_serializers <- get_serializers(c("json", "csv"))
  expect_length(multi_serializers, 2)
  expect_equal(
    sort(names(multi_serializers)),
    sort(c("application/json", "text/csv"))
  )

  # Error conditions
  expect_snapshot(
    get_serializers("nonexistent"),
    error = TRUE
  )
  expect_snapshot(get_serializers(list(c("...", "..."))), error = TRUE)
})

test_that("format_csv serializes correctly", {
  # Create formatter
  formatter <- format_csv()
  expect_type(formatter, "closure")

  # Test with a data frame
  df <- data.frame(a = 1:3, b = c("x", "y", "z"))
  result <- formatter(df)
  expect_type(result, "character")
  expect_true(grepl("a,b", result))
  expect_true(grepl("1,x", result))
})

test_that("format_tsv serializes correctly", {
  # Create formatter
  formatter <- format_tsv()
  expect_type(formatter, "closure")

  # Test with a data frame
  df <- data.frame(a = 1:3, b = c("x", "y", "z"))
  result <- formatter(df)
  expect_type(result, "character")
  expect_true(grepl("a\tb", result))
  expect_true(grepl("1\tx", result))
})

test_that("format_rds serializes correctly", {
  # Create formatter
  formatter <- format_rds()
  expect_type(formatter, "closure")

  # Test with various objects
  obj <- list(a = 1, b = "test")
  result <- formatter(obj)
  expect_type(result, "raw")

  # Test deserialization
  expect_equal(unserialize(result), obj)
})

test_that("format_yaml serializes correctly", {
  # Create formatter
  formatter <- format_yaml()
  expect_type(formatter, "closure")

  # Test with a list
  obj <- list(a = 1, b = "test", c = list(d = TRUE))
  result <- formatter(obj)
  expect_type(result, "character")
  expect_true(grepl("a: 1", result))
  expect_true(grepl("b: test", result))
})

test_that("format_format serializes correctly", {
  # Create formatter
  formatter <- format_format()
  expect_type(formatter, "closure")

  # Test with a vector
  vec <- c(1, 2, 3)
  result <- formatter(vec)
  expect_type(result, "character")
  expect_equal(result, "1\n2\n3")

  # Test with custom separator
  formatter2 <- format_format(sep = ", ")
  result2 <- formatter2(vec)
  expect_equal(result2, "1, 2, 3")
})

test_that("format_print serializes correctly", {
  # Create formatter
  formatter <- format_print()
  expect_type(formatter, "closure")

  # Test with a data frame
  df <- data.frame(a = 1:3, b = c("x", "y", "z"))
  result <- formatter(df)
  expect_type(result, "character")
  expect_true(grepl("a b", result[1]))
})

test_that("format_cat serializes correctly", {
  # Create formatter
  formatter <- format_cat()
  expect_type(formatter, "closure")

  # Test with a character vector
  vec <- c("line1", "line2", "line3")
  result <- formatter(vec)
  expect_type(result, "character")
  expect_equal(result, "line1 line2 line3\n")
})

test_that("device_formatter creates valid formatter", {
  # Mock device functions
  mock_device_open <- function(filename, ...) {
    # Just create an empty file
    file.create(filename)
    1 # Return a device ID
  }

  mock_device_close <- function() {
    # Do nothing
  }

  # Create formatter constructor
  constructor <- device_formatter(mock_device_open, mock_device_close)
  expect_s3_class(constructor, "device_constructor")

  # Create formatter
  formatter <- constructor()
  expect_s3_class(formatter, "device_formatter")

  # Check formatter has appropriate attributes
  expect_type(attr(formatter, "init"), "closure")
  expect_type(attr(formatter, "close"), "closure")
  expect_type(attr(formatter, "clean"), "closure")
  expect_type(attr(formatter, "with"), "closure")

  # Test error conditions
  bad_device <- function() {} # No filename parameter
  expect_snapshot(device_formatter(bad_device), error = TRUE)
})

test_that("formatter orchestration functions work correctly", {
  # Create a mock device formatter
  mock_device_open <- function(filename, ...) {
    # Just create an empty file
    file.create(filename)
    1 # Return a device ID
  }

  constructor <- device_formatter(mock_device_open)
  formatter <- constructor()

  # Test init_formatter
  info <- init_formatter(formatter)
  expect_type(info, "list")
  expect_true(file.exists(info$path))

  # Test with_formatter
  result <- with_formatter(42, formatter, info)
  expect_equal(result, 42)

  # Test close_formatter
  output <- close_formatter(formatter, info)
  expect_type(output, "raw")
  expect_false(file.exists(info$path)) # File should be removed

  # Test with non-device formatter
  regular_formatter <- function(x) x
  expect_null(init_formatter(regular_formatter))
  expect_null(close_formatter(regular_formatter, NULL))
  expect_null(clean_formatter(regular_formatter, NULL))
  expect_equal(with_formatter(42, regular_formatter, NULL), 42)
})

Try the plumber2 package in your browser

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

plumber2 documentation built on Jan. 20, 2026, 5:06 p.m.