context("Parsers tag") test_that("parsers can be combined", { expect_parsers <- function(names, target_names, sort_items = TRUE) { aliases <- names(make_parser(names)$alias) if (sort_items) { aliases <- sort(aliases) target_names <- sort(target_names) } expect_equal(aliases, target_names) } expect_parsers("json", "json") expect_parsers(c("form", "json"), c("form", "json"), sort_items = FALSE) expect_parsers("all", setdiff(registered_parsers(), c("all", "none"))) expect_parsers(list(all = list()), setdiff(registered_parsers(), c("all", "none"))) expect_parsers(TRUE, setdiff(registered_parsers(), c("all", "none"))) # make sure parameters are not overwritten even when including all parsers_plain <- make_parser(list(all = list(), json = list(simplifyVector = FALSE))) json_input <- parsers_plain$alias$json(charToRaw(jsonlite::toJSON(1:3))) expect_equal(json_input, list(1,2,3)) parsers_guess <- make_parser(list(all = list(), json = list(simplifyVector = TRUE))) json_input <- parsers_guess$alias$json(charToRaw(jsonlite::toJSON(1:3))) expect_equal(json_input, c(1,2,3)) # check that parsers return already combined parsers expect_equal(make_parser(parsers_plain), parsers_plain) }) test_that("parsers work", { r <- pr(test_path("files/parsers.R")) res <- PlumberResponse$new() expect_identical(r$route(make_req("POST", "/default", body='{"a":1}'), res), structure(list(1L), names = "a")) expect_identical(r$route(make_req("POST", "/none", body='{"a":1}'), res), structure(list(), names = character())) expect_identical(r$route(make_req("POST", "/all", body='{"a":1}'), res), structure(list(1L), names = "a")) bin_file <- test_path("files/multipart-ctype.bin") bin_body <- readBin(bin_file, "raw", file.info(bin_file)$size) expect_identical(r$route(make_req("POST", "/none", body=rawToChar(bin_body)), res), structure(list(), names = character())) expect_message(r$route(make_req("POST", "/json", body=rawToChar(bin_body)), res), "No suitable parser found") bin_file <- test_path("files/multipart-form.bin") bin_body <- readBin(bin_file, "raw", file.info(bin_file)$size) req <- new.env() req$REQUEST_METHOD <- "POST" req$PATH_INFO <- "/all" req$QUERY_STRING <- "" req$HTTP_CONTENT_TYPE <- "multipart/form-data; boundary=----WebKitFormBoundaryMYdShB9nBc32BUhQ" req$rook.input <- list(read_lines = function(){ stop("should not be executed") }, read = function(){ bin_body }, rewind = function(){ length(bin_body) }) parsed_body <- r$route(req, PlumberResponse$new()) expect_equal(names(parsed_body), c("json", "img1", "img2", "rds")) expect_equal(parsed_body[["rds"]], list("women.rds" = women)) expect_true(is.raw(parsed_body[["img1"]][["avatar2-small.png"]])) expect_equal(parsed_body[["json"]], list(a=2,b=4,c=list(w=3,t=5))) # expect parsers match expect_equal(r$routes$none$parsers, make_parser("none")) expect_equal(r$routes$all$parsers, make_parser("all")) expect_equal(r$routes$default$parsers, NULL) expect_equal(r$routes$json$parsers, make_parser("json")) # Paths order follow original code expect_equal(r$routes$mixed$parsers, make_parser(c("form", "json"))) expect_equal(r$routes$repeated$parsers, make_parser("json")) })