context("LogEvent")


test_that("LogEvent can have custom fields", {
  l  <- Logger$new("l")

  expect_output(l$log(100, "blubb", user_agent = "007"))
  expect_identical(l$last_event$values$user_agent, "007")

  expect_output(
    l$info("blubb %s -", "blah", user_agent = "008"),
    "blubb blah"
  )

  expect_identical(l$last_event$values$user_agent, "008")
  expect_identical(l$last_event$values$msg, "blubb blah -")
})




test_that("LogEvents preserves field order", {
  l  <- Logger$new("l", propagate = FALSE)

  l$fatal("test", c = "1", a = "2", b = "3")

  # Order depends on the internal implementation of environments I guess...
  # let's see if this will break one day.
  expect_identical(names(l$last_event)[1:3], c("c", "a", "b"))
})






# as.data.frame/table/tibble ---------------------------------------------

as_funs <- list(
  as.data.frame = as.data.frame.LogEvent,
  as.data.table = as.data.table.LogEvent,
  as_tibble = as_tibble.LogEvent
)

# nm <- "as.data.table"

for (nm in names(as_funs)){

  l  <- Logger$new("l", propagate = FALSE)

  test_that(paste0(nm, "() works as expected"), {
    l$fatal("test", df = iris, root_logger = lgr)
    res <- as_funs[[nm]](l$last_event)

    expect_identical(nrow(res), 1L)
    expect_true(is.data.frame(res$df[[1]]))
    expect_identical(res$root_logger[[1]], lgr)
    expect_identical(nrow(res$df[[1]]), 150L)
  })


  test_that(paste0(nm, "() vectorizes over msg"), {
    l  <- Logger$new("l", propagate = FALSE)
    l$fatal(c("test", "test2"), letters = letters, df = iris, root_logger = lgr)

    res <- as_funs[[nm]](l$last_event)

    expect_identical(nrow(res), 2L)
    expect_true(is.data.frame(res$df[[1]]))
    expect_true(is.data.frame(res$df[[2]]))
    expect_true(is.character(res$letters[[1]]))
    expect_true(is.character(res$letters[[2]]))
    expect_identical(nrow(res$df[[1]]), 150L)
    expect_identical(nrow(res$df[[2]]), 150L)
  })
}





test_that("as_LogEvent.list and as_LogEvent.data.frame work", {

  ts <- Sys.time()

  l <- list(
    level = 100,
    msg = "blah",
    timestamp = ts,
    caller = NA,
    foo = "bar"
  )

  Sys.sleep(1)
  expect_identical(as_LogEvent(l)$timestamp, l$timestamp)
  expect_s3_class(as_LogEvent(l), "LogEvent")
  expect_s3_class(as_LogEvent(as.data.frame(l)), "LogEvent")


  l <- list(
    level = 100,
    msg = "blah",
    `@timestamp` = ts,
    caller = NA,
    foo = "bar"
  )

  expect_identical(as_LogEvent(l)[["timestamp"]], l[["@timestamp"]])
  expect_s3_class(as_LogEvent(l), "LogEvent")
  expect_s3_class(as_LogEvent(as.data.frame(l)), "LogEvent")
})
