Skip to main content
Glama

Todoist MCP Server

task-handlers-update.test.ts4.36 kB
import { describe, expect, test, jest } from "@jest/globals"; import { handleUpdateTask, handleBulkUpdateTasks, } from "../handlers/task-handlers"; import type { TodoistApi } from "@doist/todoist-api-typescript"; import type { TodoistTask } from "../types.js"; type ApiTask = Awaited<ReturnType<TodoistApi["getTask"]>>; type ApiTaskList = Awaited<ReturnType<TodoistApi["moveTasks"]>>; type ApiTaskUpdate = Awaited<ReturnType<TodoistApi["updateTask"]>>; type ApiTasksResponse = Awaited<ReturnType<TodoistApi["getTasks"]>>; type ApiProjectsResponse = Awaited<ReturnType<TodoistApi["getProjects"]>>; describe("handleUpdateTask section moves", () => { test("calls moveTasks when section_id is provided", async () => { const task: TodoistTask = { id: "123", content: "Sample task", priority: 1, projectId: "proj-1", sectionId: "section-old", }; const getTask = jest .fn<TodoistApi["getTask"]>() .mockResolvedValue(task as unknown as ApiTask); const updateTask = jest .fn<TodoistApi["updateTask"]>() .mockResolvedValue(task as unknown as ApiTaskUpdate); const moveTasks = jest.fn<TodoistApi["moveTasks"]>().mockResolvedValue([ { ...task, sectionId: "section-new", }, ] as unknown as ApiTaskList); const todoistClient = { getTask, updateTask, moveTasks, } as unknown as TodoistApi; const message = await handleUpdateTask(todoistClient, { task_id: "123", section_id: "section-new", }); expect(updateTask).not.toHaveBeenCalled(); expect(moveTasks).toHaveBeenCalledWith(["123"], { sectionId: "section-new", }); expect(message).toContain("New Section ID: section-new"); }); test("updates content and moves project when both provided", async () => { const task: TodoistTask = { id: "a1", content: "Initial", priority: 1, projectId: "proj-old", sectionId: "section-old", }; const getTask = jest .fn<TodoistApi["getTask"]>() .mockResolvedValue(task as unknown as ApiTask); const updateTask = jest.fn<TodoistApi["updateTask"]>().mockResolvedValue({ ...task, content: "Updated", } as unknown as ApiTaskUpdate); const moveTasks = jest.fn<TodoistApi["moveTasks"]>().mockResolvedValue([ { ...task, content: "Updated", projectId: "proj-new", }, ] as unknown as ApiTaskList); const todoistClient = { getTask, updateTask, moveTasks, } as unknown as TodoistApi; const message = await handleUpdateTask(todoistClient, { task_id: "a1", content: "Updated", project_id: "proj-new", }); expect(updateTask).toHaveBeenCalledWith("a1", { content: "Updated", }); expect(moveTasks).toHaveBeenCalledWith(["a1"], { projectId: "proj-new", }); expect(message).toContain("New Project ID: proj-new"); expect(message).toContain("New Title: Updated"); }); }); describe("handleBulkUpdateTasks move support", () => { test("uses moveTasks when section updates are requested", async () => { const tasks: TodoistTask[] = [ { id: "bulk-1", content: "Bulk task", priority: 1, projectId: "proj-1", sectionId: null, }, ]; const getTasks = jest .fn<TodoistApi["getTasks"]>() .mockResolvedValue(tasks as unknown as ApiTasksResponse); const updateTask = jest .fn<TodoistApi["updateTask"]>() .mockResolvedValue(tasks[0] as unknown as ApiTaskUpdate); const moveTasks = jest.fn<TodoistApi["moveTasks"]>().mockResolvedValue([ { ...tasks[0], sectionId: "section-new", }, ] as unknown as ApiTaskList); const todoistClient = { getTasks, updateTask, moveTasks, getProjects: jest .fn<TodoistApi["getProjects"]>() .mockResolvedValue([] as unknown as ApiProjectsResponse), } as unknown as TodoistApi; await handleBulkUpdateTasks(todoistClient, { search_criteria: { project_id: "proj-1", }, updates: { section_id: "section-new", }, }); expect(updateTask).not.toHaveBeenCalled(); expect(moveTasks).toHaveBeenCalledWith(["bulk-1"], { sectionId: "section-new", }); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/greirson/mcp-todoist'

If you have feedback or need assistance with the MCP directory API, please join our Discord server