testing-clickup-cli
Test Suite Overview
| Suite | Command | Files | What it tests |
|---|---|---|---|
| Unit | npm test |
tests/unit/**/*.test.ts |
All commands, API client, formatters, config. Mocks ClickUpClient. |
| E2E | npm run test:e2e |
tests/e2e/**/*.e2e.ts |
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 (M/DD - M/DD) 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
docs/commands.mdquick reference section matches what metadata generates
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
ClickUpClientwith the methods your command uses - Test happy path, error cases, edge cases
- Run
npm test -- tests/unit/commands/<name>.test.ts
New e2e test
- Add to
tests/e2e/lifecycle.e2e.tsor create a new*.e2e.tsfile - Use the Backlog list in E2E Tests space for creating test data
- Always clean up: delete created tasks/checklists in
afterAll - Use
describe.skipIf(!TOKEN)to skip when no API token is set - 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.