tests/testthat/test-tools.R

context("tools")

## Pretty simple tests here; just aiming not to fail.
test_that("parse_info", {
  con <- test_hiredis_connection()
  skip_if_no_info(con)
  info <- redis_info(con)
  expect_is(info, "list")
  dat <- con$INFO()
  expect_is(parse_info(dat), "list")
  expect_equal(redis_version(con), info$redis_version)
})

## TODO: not totally clear how this should interact with pipeline; I
## think that the pipeline interface is much nicer and naturally deals
## with errors in a better way.  But it's not atomic of course.

## TODO: of the transaction commands, need to make sure we use all of:
##
## * DISCARD
## * EXEC
## * MULTI
## * UNWATCH
## * WATCH
##
## but at this point I don't think all are used.  WATCH in particular
## might not be possible
test_that("redis_multi", {
  con <- test_hiredis_connection()
  id <- rand_str()
  on.exit(con$DEL(id))
  con$DEL(id)
  ok <- redis_multi(con, {
    con$INCR(id)
    con$INCR(id)
  })
  expect_equal(ok, list(1, 2))

  ## If we get an error, things do *not* get evaluated:
  err <- try(redis_multi(con, {
    con$INCR(id)
    con$INCR(id)
    stop("abort")
  }), silent = TRUE)
  expect_equal(con$GET(id), "2")
  expect_is(err, "try-error")

  expect_error(con$EXEC(), "ERR EXEC without MULTI")
})

test_that("from_redis_hash", {
  con <- test_hiredis_connection()

  key <- rand_str()
  fields <- letters[1:5]
  vals <- 1:5
  con$HMSET(key, fields, vals)
  on.exit(con$DEL(key))

  res <- from_redis_hash(con, key)
  cmp <- setNames(as.character(vals), fields)
  expect_true(all(fields %in% names(res)))
  expect_equal(res[fields], cmp)

  expect_equal(from_redis_hash(con, key, f = identity)[fields],
               as.list(cmp))

  expect_equal(from_redis_hash(con, key, "a"), cmp["a"])
  expect_equal(from_redis_hash(con, key, "a", f = identity),
               as.list(cmp)["a"])

  expect_equal(from_redis_hash(con, key, c("a", "xxx")),
               c(a = "1", xxx = NA_character_))

  expect_equal(from_redis_hash(con, key, character(0)),
               setNames(character(0), character(0)))
})

test_that("redis_time", {
  con <- test_hiredis_connection()
  skip_if_no_time(con)

  expect_is(redis_time(con), "character")
  expect_is(redis_time_to_r(redis_time(con)), "POSIXt")
})

## This is just a really simple test that this works at all:
test_that("scripts", {
  r <- test_hiredis_connection()
  ## A little lua script
  lua <- '
  local keyname = KEYS[1]
  local value = ARGV[1]
  redis.call("SET", keyname, value)
  redis.call("INCR", keyname)
  return redis.call("GET", keyname)'

  key <- rand_str()

  obj <- redis_scripts(r, set_and_incr = lua)
  r$DEL(key)
  res <- obj("set_and_incr", key, "10")
  expect_equal(res, "11")
  r$DEL(key)
})

test_that("parse_client_info", {
  str <- 'id=3 addr=127.0.0.1:56110 fd=6 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client\n'
  dat <- parse_client_info(str)
  expect_is(dat, "list")
  expect_equal(length(dat), 1)
  expect_is(dat[[1]], "character")
  expect_equal(dat[[1]][["id"]], "3")

  expect_equal(parse_client_info(""), list())
})
richfitz/redux documentation built on Jan. 19, 2024, 5:53 p.m.