tests/testthat/test-activity.R

# Tests for activity logs functions

library(rtodoist)

# Load fixtures
activity_json <- jsonlite::read_json(
  test_path("fixtures", "activity_logs_response.json")
)

test_that("activity logs dataframe has correct structure from fixture", {
  events <- activity_json$events

  events_df <- purrr::map_dfr(events, function(x) {
    data.frame(
      id = x$id %||% NA_character_,
      object_type = x$object_type %||% NA_character_,
      object_id = x$object_id %||% NA_character_,
      event_type = x$event_type %||% NA_character_,
      event_date = x$event_date %||% NA_character_,
      initiator_id = x$initiator_id %||% NA_character_,
      parent_project_id = x$parent_project_id %||% NA_character_,
      parent_item_id = x$parent_item_id %||% NA_character_,
      stringsAsFactors = FALSE
    )
  })

  expect_true("id" %in% names(events_df))
  expect_true("object_type" %in% names(events_df))
  expect_true("object_id" %in% names(events_df))
  expect_true("event_type" %in% names(events_df))
  expect_true("event_date" %in% names(events_df))
  expect_true("initiator_id" %in% names(events_df))
  expect_equal(nrow(events_df), 3)
})

test_that("activity logs contain expected event types", {
  events <- activity_json$events

  events_df <- purrr::map_dfr(events, function(x) {
    data.frame(
      id = x$id,
      event_type = x$event_type,
      stringsAsFactors = FALSE
    )
  })

  expect_true("added" %in% events_df$event_type)
  expect_true("completed" %in% events_df$event_type)
  expect_true("updated" %in% events_df$event_type)
})

test_that("activity logs contain expected object types", {
  events <- activity_json$events

  object_types <- sapply(events, function(x) x$object_type)

  expect_true("item" %in% object_types)
  expect_true("project" %in% object_types)
})

test_that("empty activity logs returns empty dataframe", {
  empty_response <- list(events = list())

  result <- data.frame(
    id = character(),
    object_type = character(),
    object_id = character(),
    event_type = character(),
    event_date = character(),
    initiator_id = character(),
    parent_project_id = character(),
    parent_item_id = character(),
    stringsAsFactors = FALSE
  )

  expect_equal(nrow(result), 0)
  expect_true("id" %in% names(result))
  expect_true("event_type" %in% names(result))
  expect_true("initiator_id" %in% names(result))
  expect_true("parent_project_id" %in% names(result))
  expect_true("parent_item_id" %in% names(result))
})

# Integration tests (require API token and premium account)
# Note: activity_logs endpoint may require premium/business account
test_that("get_activity_logs returns dataframe", {
  skip_if_no_token()
  skip_on_ci_or_cran()
  skip("Activity logs endpoint requires premium account")

  logs <- get_activity_logs(limit = 10)

  expect_s3_class(logs, "data.frame")
  expect_true("id" %in% names(logs) || nrow(logs) == 0)
})

test_that("get_activity_logs respects limit parameter", {
  skip_if_no_token()
  skip_on_ci_or_cran()
  skip("Activity logs endpoint requires premium account")

  logs <- get_activity_logs(limit = 5)

  expect_s3_class(logs, "data.frame")
  expect_lte(nrow(logs), 5)
})

test_that("get_activity_logs filters by object_type", {
  skip_if_no_token()
  skip_on_ci_or_cran()
  skip("Activity logs endpoint requires premium account")

  logs <- get_activity_logs(object_type = "item", limit = 10)

  expect_s3_class(logs, "data.frame")
  if (nrow(logs) > 0) {
    expect_true(all(logs$object_type == "item"))
  }
})

Try the rtodoist package in your browser

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

rtodoist documentation built on Feb. 14, 2026, 5:06 p.m.