library(httpuv)
library(promises)
library(testthat)

content <- list(
  status = 200L,
  headers = list(
    'Content-Type' = 'text/html'
  ),
  body = "abc"
)


app_handle <- startServer(
  "0.0.0.0",
  app_port,
  list(
    onHeaders = function(req) {
      if (req$PATH_INFO == "/header") {
        content$body <- "this is a response from onHeaders()\n"
        return(content)
      } else if (req$PATH_INFO == "/header-delay") {
        print(capture.output(print(str(as.list(req)))))
        Sys.sleep(5)
        return(content)
      } else if (req$PATH_INFO == "/header-print") {
        print(capture.output(print(str(as.list(req)))))
        return(content)
      } else if (req$PATH_INFO == "/header-error") {
        stop("Error in app (header)")
      } else {
        return(NULL)
      }
    },
    call = function(req) {
      if (req$PATH_INFO %in% c("/", "/sync")) {
        return(content)
      } else if (req$PATH_INFO == "/body-error") {
        return(content)
      } else if (req$PATH_INFO == "/sync-delay") {
        Sys.sleep(5)
        return(content)
      } else if (req$PATH_INFO == "/sync-error") {
        stop("Error in app (sync)")
      } else if (req$PATH_INFO == "/async") {
        promise(function(resolve, reject) {
          resolve(content)
        })
      } else if (req$PATH_INFO == "/async-delay") {
        promise(function(resolve, reject) {
          Sys.sleep(5)
          resolve(content)
        })
      } else if (req$PATH_INFO == "/async-error") {
        promise(function(resolve, reject) {
          stop("Error in app (async)")
        })
      } else {
        stop("Unknown request path:", req$PATH_INFO)
      }
    },
    staticPaths = list(
      "/static" = test_path("apps/content"),
      "/static_fallthrough" = staticPath(
        test_path("apps/content"),
        fallthrough = TRUE
      )
    )
  )
)
