Clickup-cli testing-clickup-cli
Run and manage tests for clickup-cli. Covers unit tests, e2e tests against a real ClickUp workspace, and the test data setup. Use when running tests, adding test coverage, debugging test failures, or setting up test fixtures.
git clone https://github.com/krodak/clickup-cli
T=$(mktemp -d) && git clone --depth=1 https://github.com/krodak/clickup-cli "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.agents/skills/testing-clickup-cli" ~/.claude/skills/krodak-clickup-cli-testing-clickup-cli && rm -rf "$T"
.agents/skills/testing-clickup-cli/SKILL.mdTest Suite Overview
| Suite | Command | Files | What it tests |
|---|---|---|---|
| Unit | | | All commands, API client, formatters, config. Mocks ClickUpClient. |
| E2E | | | Real API calls against a live ClickUp workspace. |
Unit tests run in CI. E2E tests require
CLICKUP_API_TOKEN in .env.test and are not part of CI.
Running Tests
npm test # all unit tests npm test -- tests/unit/commands/ # just command tests npm test -- -t "sprint" # filter by test name npm run test:e2e # e2e tests (needs .env.test)
The unit test global setup runs
npm run build before tests start.
E2E Test Workspace
Tests run against the personal ClickUp workspace (profile:
personal).
Space: E2E Tests (90166622768)
Pre-populated with test fixtures:
| Fixture | What it contains |
|---|---|
| Sprints folder | 3 sprint lists with date ranges. Sprint 2 is "current". |
| Backlog list | General tasks for CRUD testing. E2E lifecycle tests create/delete tasks here. |
| Tasks | 11 tasks with varied statuses, priorities, assignees, due dates, tags. |
| Subtasks | 3 subtasks under "Implement user authentication". |
| Checklist | "CI Steps" with 5 items (3 resolved). |
| Tags | backend, frontend, security, design, bug. |
| Comments | 2 comments on the auth task. |
| Dependencies | "Design landing page" depends on "Set up CI pipeline". |
| Overdue task | "Fix login redirect bug" in Sprint 1 with past due date. |
Space: ClickUp CLI (90166622769)
Project tracking space. Not used for tests - used for tracking releases and features.
E2E Test Patterns
Lifecycle tests (tests/e2e/lifecycle.e2e.ts)
These create test data, verify operations, and clean up:
| Suite | Tests | Coverage |
|---|---|---|
| Task lifecycle | 13 | Create, read, update, subtask, comment, checklist, delete, confirm gone |
| Tag lifecycle | 4 | Add tag, verify, remove, verify removed |
| Time tracking | 5 | Start timer, check running, stop, log entry, list entries |
Each suite uses
beforeAll to find the Backlog list and afterAll to clean up created tasks.
API tests (tests/e2e/api.e2e.ts)
Tests API client methods directly: getSpaces, getLists, getTask, sprint detection.
Unit Test Patterns
Mocking ClickUpClient
Every command test mocks the API client with
vi.mock:
const mockGetTask = vi.fn().mockResolvedValue({ id: 't1', name: 'Task' }) vi.mock('../../../src/api.js', () => ({ ClickUpClient: vi.fn().mockImplementation(function () { return { getTask: mockGetTask } }), }))
The
function keyword (not arrow) is required for Vitest 4's new semantics.
Testing command functions
Commands export pure functions. Tests import and call them directly:
const { updateTask } = await import('../../../src/commands/update.js') await updateTask({ apiToken: 'pk_t', teamId: 'team1' }, 't1', { status: 'done' }) expect(mockUpdateTask).toHaveBeenCalledWith('t1', { status: 'done' })
Metadata sync test
tests/unit/commands/completion.test.ts verifies that:
- Every command registered in Commander is listed in
src/commands/metadata.ts - The
quick reference section matches what metadata generatesdocs/commands.md
If you add a new command, you MUST add it to metadata.ts. If you add new flags, add them too. Then run
node --import tsx scripts/sync-command-docs.ts to regenerate the docs.
Adding New Tests
New unit test
- Create
tests/unit/commands/<name>.test.ts - Mock
with the methods your command usesClickUpClient - Test happy path, error cases, edge cases
- Run
npm test -- tests/unit/commands/<name>.test.ts
New e2e test
- Add to
or create a newtests/e2e/lifecycle.e2e.ts
file*.e2e.ts - Use the Backlog list in E2E Tests space for creating test data
- Always clean up: delete created tasks/checklists in
afterAll - Use
to skip when no API token is setdescribe.skipIf(!TOKEN) - Run
npm run test:e2e
Config for E2E
# .env.test (gitignored) CLICKUP_API_TOKEN=pk_... # personal workspace token
Copy from
.env.test.example and fill in your token.