tests/testthat/test-tasks.R

# Tests for task management functions

test_that("get_tasks returns a list", {
  skip_on_cran()
  skip_if_no_token()

  tasks <- get_tasks()

  expect_type(tasks, "list")
})

test_that("add_tasks_in_project adds simple tasks", {
  skip_on_cran()
  skip_if_no_token()
  skip_if_test_project_missing()

  proj_id <- get_project_id(TEST_PROJECT_NAME, create = FALSE)
  unique_task <- paste0("Test_Task_", format(Sys.time(), "%H%M%S"))

  result <- add_tasks_in_project(
    project_id = proj_id,
    tasks = unique_task,
    verbose = FALSE
  )

  expect_type(result, "character")

  # Verify task was created
  proj_tasks <- get_tasks_of_project(project_id = proj_id)
  task_names <- sapply(proj_tasks, function(x) x$content)
  expect_true(unique_task %in% task_names)
})

test_that("add_tasks_in_project adds tasks with responsible and assigns correctly", {
  skip_on_cran()
  skip_if_no_token()
  skip_if_test_project_missing()

  proj_id <- get_project_id(TEST_PROJECT_NAME, create = FALSE)
  unique_task <- paste0("Task_With_Responsible_", format(Sys.time(), "%H%M%S"))

  # Get the expected user ID
  all_users <- get_all_users()
  expected_uid <- all_users$id[all_users$email == TEST_COLLABORATORS[1]]

  # Create task with responsible
  result <- add_tasks_in_project(
    project_id = proj_id,
    tasks = unique_task,
    responsible = TEST_COLLABORATORS[1],
    verbose = FALSE
  )

  expect_type(result, "character")

  # Wait for API sync
  Sys.sleep(1)

  # Verify task was created WITH the correct responsible_uid

  proj_tasks <- get_tasks_of_project(project_id = proj_id)
  task_found <- FALSE
  for (t in proj_tasks) {
    if (t$content == unique_task) {
      task_found <- TRUE
      expect_equal(t$responsible_uid, expected_uid,
        info = paste("Task should be assigned to", TEST_COLLABORATORS[1]))
      break
    }
  }
  expect_true(task_found, info = "Task should exist in project")
})

test_that("add_tasks_in_project adds tasks with due date", {
  skip_on_cran()
  skip_if_no_token()
  skip_if_test_project_missing()

  proj_id <- get_project_id(TEST_PROJECT_NAME, create = FALSE)
  unique_task <- paste0("Task_With_Due_", format(Sys.time(), "%H%M%S"))
  future_date <- format(Sys.Date() + 7, "%Y-%m-%d")

  result <- add_tasks_in_project(
    project_id = proj_id,
    tasks = unique_task,
    due = future_date,
    verbose = FALSE
  )

  expect_type(result, "character")
})

test_that("add_tasks_in_project adds tasks with section", {
  skip_on_cran()
  skip_if_no_token()
  skip_if_test_project_missing()

  proj_id <- get_project_id(TEST_PROJECT_NAME, create = FALSE)
  unique_task <- paste0("Task_With_Section_", format(Sys.time(), "%H%M%S"))

  result <- add_tasks_in_project(
    project_id = proj_id,
    tasks = unique_task,
    section_name = "Section A - Preparation",
    verbose = FALSE
  )

  expect_type(result, "character")
})

test_that("add_tasks_in_project check_only returns dataframe without creating tasks", {
  skip_on_cran()
  skip_if_no_token()
  skip_if_test_project_missing()

  proj_id <- get_project_id(TEST_PROJECT_NAME, create = FALSE)
  unique_task <- paste0("Check_Only_Task_", format(Sys.time(), "%H%M%S"))

  # Get task count before
  tasks_before <- get_tasks_of_project(project_id = proj_id)
  count_before <- length(tasks_before)

  # Run with check_only = TRUE
  result <- add_tasks_in_project(
    project_id = proj_id,
    tasks = unique_task,
    check_only = TRUE,
    verbose = FALSE
  )

  # Should return a dataframe
  expect_s3_class(result, "data.frame")

  # Task count should be the same (no task added)
  tasks_after <- get_tasks_of_project(project_id = proj_id)
  expect_equal(length(tasks_after), count_before)
})

test_that("add_tasks_in_project_from_df adds tasks from dataframe", {
  skip_on_cran()
  skip_if_no_token()
  skip_if_test_project_missing()

  proj_id <- get_project_id(TEST_PROJECT_NAME, create = FALSE)
  timestamp <- format(Sys.time(), "%H%M%S")

  tasks_df <- data.frame(
    tasks = c(
      paste0("DF_Task_1_", timestamp),
      paste0("DF_Task_2_", timestamp)
    ),
    responsible = c(TEST_COLLABORATORS[1], TEST_COLLABORATORS[2]),
    due = c(
      format(Sys.Date() + 7, "%Y-%m-%d"),
      format(Sys.Date() + 8, "%Y-%m-%d")
    ),
    section_name = c("Section A - Preparation", "Section B - Execution"),
    stringsAsFactors = FALSE
  )

  result <- add_tasks_in_project_from_df(
    project_id = proj_id,
    tasks_as_df = tasks_df,
    verbose = FALSE
  )

  expect_type(result, "character")
})

test_that("get_tasks_of_project returns tasks for specific project", {
  skip_on_cran()
  skip_if_no_token()
  skip_if_test_project_missing()

  proj_id <- get_project_id(TEST_PROJECT_NAME, create = FALSE)

  tasks <- get_tasks_of_project(project_id = proj_id)

  expect_type(tasks, "list")
  expect_true(length(tasks) > 0)

  # All tasks should have required fields
  if (length(tasks) > 0) {
    first_task <- tasks[[1]]
    expect_true("content" %in% names(first_task))
    expect_true("project_id" %in% names(first_task))
    expect_true("id" %in% names(first_task))
  }
})

test_that("add_responsible_to_task assigns user to existing task", {
  skip_on_cran()
  skip_if_no_token()
  skip_if_test_project_missing()

  proj_id <- get_project_id(TEST_PROJECT_NAME, create = FALSE)
  unique_task <- paste0("Task_For_Assignment_", format(Sys.time(), "%H%M%S"))

  # First create a task without responsible
  add_tasks_in_project(
    project_id = proj_id,
    tasks = unique_task,
    verbose = FALSE
  )

  # Then assign a responsible
  result <- add_responsible_to_task(
    project_id = proj_id,
    task = unique_task,
    responsible = TEST_COLLABORATORS[1],
    verbose = FALSE
  )

  # Function should complete without error
  expect_true(TRUE)
})

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.