Skip to content

Commit 69a2ef2

Browse files
authored
refactor: [BREAKING] update Task and Project schemas to match API objects (#286)
1 parent 0822e24 commit 69a2ef2

27 files changed

+742
-563
lines changed

src/TodoistApi.projects.test.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ import { TodoistApi } from '.'
22
import {
33
DEFAULT_AUTH_TOKEN,
44
DEFAULT_PROJECT,
5-
RAW_DEFAULT_PROJECT,
65
DEFAULT_REQUEST_ID,
76
DEFAULT_USER,
7+
PROJECT_WITH_OPTIONALS_AS_NULL,
8+
DEFAULT_PROJECT_ID,
89
} from './testUtils/testDefaults'
910
import {
1011
getSyncBaseUri,
1112
ENDPOINT_REST_PROJECTS,
1213
ENDPOINT_REST_PROJECT_COLLABORATORS,
1314
} from './consts/endpoints'
1415
import { setupRestClientMock } from './testUtils/mocks'
16+
import { getProjectUrl } from './utils/urlHelpers'
1517

1618
function getTarget() {
1719
return new TodoistApi(DEFAULT_AUTH_TOKEN)
@@ -21,7 +23,7 @@ describe('TodoistApi project endpoints', () => {
2123
describe('getProject', () => {
2224
test('calls get request with expected url', async () => {
2325
const projectId = '12'
24-
const requestMock = setupRestClientMock(RAW_DEFAULT_PROJECT)
26+
const requestMock = setupRestClientMock(DEFAULT_PROJECT)
2527
const api = getTarget()
2628

2729
await api.getProject(projectId)
@@ -36,7 +38,7 @@ describe('TodoistApi project endpoints', () => {
3638
})
3739

3840
test('returns result from rest client', async () => {
39-
setupRestClientMock(RAW_DEFAULT_PROJECT)
41+
setupRestClientMock(DEFAULT_PROJECT)
4042
const api = getTarget()
4143

4244
const project = await api.getProject('123')
@@ -48,7 +50,7 @@ describe('TodoistApi project endpoints', () => {
4850
describe('getProjects', () => {
4951
test('calls get on projects endpoint', async () => {
5052
const requestMock = setupRestClientMock({
51-
results: [RAW_DEFAULT_PROJECT],
53+
results: [DEFAULT_PROJECT],
5254
nextCursor: '123',
5355
})
5456
const api = getTarget()
@@ -67,13 +69,13 @@ describe('TodoistApi project endpoints', () => {
6769
})
6870

6971
test('returns result from rest client', async () => {
70-
const projects = [RAW_DEFAULT_PROJECT]
72+
const projects = [DEFAULT_PROJECT, PROJECT_WITH_OPTIONALS_AS_NULL]
7173
setupRestClientMock({ results: projects, nextCursor: '123' })
7274
const api = getTarget()
7375

7476
const { results, nextCursor } = await api.getProjects()
7577

76-
expect(results).toEqual([DEFAULT_PROJECT])
78+
expect(results).toEqual(projects)
7779
expect(nextCursor).toBe('123')
7880
})
7981
})
@@ -84,7 +86,7 @@ describe('TodoistApi project endpoints', () => {
8486
}
8587

8688
test('calls post on restClient with expected parameters', async () => {
87-
const requestMock = setupRestClientMock(RAW_DEFAULT_PROJECT)
89+
const requestMock = setupRestClientMock(DEFAULT_PROJECT)
8890
const api = getTarget()
8991

9092
await api.addProject(DEFAULT_ADD_PROJECT_ARGS, DEFAULT_REQUEST_ID)
@@ -101,7 +103,7 @@ describe('TodoistApi project endpoints', () => {
101103
})
102104

103105
test('returns result from rest client', async () => {
104-
setupRestClientMock(RAW_DEFAULT_PROJECT)
106+
setupRestClientMock(DEFAULT_PROJECT)
105107
const api = getTarget()
106108

107109
const project = await api.addProject(DEFAULT_ADD_PROJECT_ARGS)
@@ -112,10 +114,15 @@ describe('TodoistApi project endpoints', () => {
112114

113115
describe('updateProject', () => {
114116
const DEFAULT_UPDATE_PROJECT_ARGS = { name: 'a name' }
117+
const DEFAULT_UPDATED_PROJECT_URL = getProjectUrl(
118+
DEFAULT_PROJECT_ID,
119+
DEFAULT_UPDATE_PROJECT_ARGS.name,
120+
)
121+
115122
test('calls post on restClient with expected parameters', async () => {
116123
const projectId = '123'
117124
const updateArgs = { name: 'a new name' }
118-
const requestMock = setupRestClientMock(RAW_DEFAULT_PROJECT, 204)
125+
const requestMock = setupRestClientMock(DEFAULT_PROJECT, 204)
119126
const api = getTarget()
120127

121128
await api.updateProject(projectId, updateArgs, DEFAULT_REQUEST_ID)
@@ -132,20 +139,17 @@ describe('TodoistApi project endpoints', () => {
132139
})
133140

134141
test('returns success result from rest client', async () => {
135-
const RAW_DEFAULT_PROJECT_WITH_UPDATES = {
136-
...RAW_DEFAULT_PROJECT,
137-
name: DEFAULT_UPDATE_PROJECT_ARGS.name,
142+
const returnedProject = {
143+
...DEFAULT_PROJECT,
144+
...DEFAULT_UPDATE_PROJECT_ARGS,
145+
url: DEFAULT_UPDATED_PROJECT_URL,
138146
}
139-
setupRestClientMock(RAW_DEFAULT_PROJECT_WITH_UPDATES, 204)
147+
setupRestClientMock(returnedProject, 204)
140148
const api = getTarget()
141149

142150
const result = await api.updateProject('123', DEFAULT_UPDATE_PROJECT_ARGS)
143151

144-
const DEFAULT_PROJECT_WITH_UPDATES = {
145-
...DEFAULT_PROJECT,
146-
name: DEFAULT_UPDATE_PROJECT_ARGS.name,
147-
}
148-
expect(result).toEqual(DEFAULT_PROJECT_WITH_UPDATES)
152+
expect(result).toEqual(returnedProject)
149153
})
150154
})
151155

src/TodoistApi.tasks.test.ts

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
import * as taskConverters from './utils/taskConverters'
21
import { TodoistApi } from '.'
3-
import { Task } from './types'
42
import {
53
DEFAULT_AUTH_TOKEN,
6-
DEFAULT_QUICK_ADD_RESPONSE,
74
DEFAULT_REQUEST_ID,
85
DEFAULT_TASK,
9-
RAW_DEFAULT_TASK,
106
TASK_WITH_OPTIONALS_AS_NULL,
7+
DEFAULT_TASK_ID,
118
} from './testUtils/testDefaults'
129
import {
1310
getSyncBaseUri,
@@ -18,10 +15,7 @@ import {
1815
ENDPOINT_SYNC_QUICK_ADD,
1916
} from './consts/endpoints'
2017
import { setupRestClientMock } from './testUtils/mocks'
21-
22-
function setupSyncTaskConverter(returnedTask: Task) {
23-
return jest.spyOn(taskConverters, 'getTaskFromQuickAddResponse').mockReturnValue(returnedTask)
24-
}
18+
import { getTaskUrl } from './utils/urlHelpers'
2519

2620
function getTarget(baseUrl = 'https://api.todoist.com') {
2721
return new TodoistApi(DEFAULT_AUTH_TOKEN, baseUrl)
@@ -34,7 +28,7 @@ describe('TodoistApi task endpoints', () => {
3428
}
3529

3630
test('calls post on restClient with expected parameters', async () => {
37-
const requestMock = setupRestClientMock(RAW_DEFAULT_TASK)
31+
const requestMock = setupRestClientMock(DEFAULT_TASK)
3832
const api = getTarget()
3933

4034
await api.addTask(DEFAULT_ADD_TASK_ARGS, DEFAULT_REQUEST_ID)
@@ -51,7 +45,7 @@ describe('TodoistApi task endpoints', () => {
5145
})
5246

5347
test('calls post on restClient with expected parameters against staging', async () => {
54-
const requestMock = setupRestClientMock(RAW_DEFAULT_TASK)
48+
const requestMock = setupRestClientMock(DEFAULT_TASK)
5549
const api = getTarget('https://staging.todoist.com')
5650

5751
await api.addTask(DEFAULT_ADD_TASK_ARGS, DEFAULT_REQUEST_ID)
@@ -68,7 +62,7 @@ describe('TodoistApi task endpoints', () => {
6862
})
6963

7064
test('returns result from rest client', async () => {
71-
setupRestClientMock(RAW_DEFAULT_TASK)
65+
setupRestClientMock(DEFAULT_TASK)
7266
const api = getTarget()
7367

7468
const task = await api.addTask(DEFAULT_ADD_TASK_ARGS)
@@ -79,10 +73,14 @@ describe('TodoistApi task endpoints', () => {
7973

8074
describe('updateTask', () => {
8175
const DEFAULT_UPDATE_TASK_ARGS = { content: 'some new content' }
76+
const DEFAULT_UPDATED_TASK_URL = getTaskUrl(
77+
DEFAULT_TASK_ID,
78+
DEFAULT_UPDATE_TASK_ARGS.content,
79+
)
8280

8381
test('calls post on restClient with expected parameters', async () => {
8482
const taskId = '123'
85-
const requestMock = setupRestClientMock(RAW_DEFAULT_TASK, 204)
83+
const requestMock = setupRestClientMock(DEFAULT_TASK, 204)
8684
const api = getTarget()
8785

8886
await api.updateTask(taskId, DEFAULT_UPDATE_TASK_ARGS, DEFAULT_REQUEST_ID)
@@ -99,20 +97,17 @@ describe('TodoistApi task endpoints', () => {
9997
})
10098

10199
test('returns success result from rest client', async () => {
102-
const RAW_DEFAULT_TASK_WITH_UPDATES = {
103-
...RAW_DEFAULT_TASK,
104-
content: DEFAULT_UPDATE_TASK_ARGS.content,
100+
const returnedTask = {
101+
...DEFAULT_TASK,
102+
...DEFAULT_UPDATE_TASK_ARGS,
103+
url: DEFAULT_UPDATED_TASK_URL,
105104
}
106-
setupRestClientMock(RAW_DEFAULT_TASK_WITH_UPDATES, 204)
105+
setupRestClientMock(returnedTask, 204)
107106
const api = getTarget()
108107

109108
const response = await api.updateTask('123', DEFAULT_UPDATE_TASK_ARGS)
110109

111-
const DEFAULT_TASK_WITH_UPDATES = {
112-
...DEFAULT_TASK,
113-
content: DEFAULT_UPDATE_TASK_ARGS.content,
114-
}
115-
expect(response).toEqual(DEFAULT_TASK_WITH_UPDATES)
110+
expect(response).toEqual(returnedTask)
116111
})
117112
})
118113

@@ -212,7 +207,7 @@ describe('TodoistApi task endpoints', () => {
212207
}
213208

214209
test('calls sync endpoint with expected parameters', async () => {
215-
const requestMock = setupRestClientMock(DEFAULT_QUICK_ADD_RESPONSE)
210+
const requestMock = setupRestClientMock(DEFAULT_TASK)
216211
const api = getTarget()
217212

218213
await api.quickAddTask(DEFAULT_QUICK_ADD_ARGS)
@@ -228,22 +223,17 @@ describe('TodoistApi task endpoints', () => {
228223
})
229224

230225
test('calls task converter with response data and returns result', async () => {
231-
setupRestClientMock(DEFAULT_QUICK_ADD_RESPONSE)
232-
const taskConverter = setupSyncTaskConverter(DEFAULT_TASK)
226+
setupRestClientMock(DEFAULT_TASK)
233227
const api = getTarget()
234-
235228
const task = await api.quickAddTask(DEFAULT_QUICK_ADD_ARGS)
236-
237-
expect(taskConverter).toBeCalledTimes(1)
238-
expect(taskConverter).toBeCalledWith(DEFAULT_QUICK_ADD_RESPONSE)
239229
expect(task).toEqual(DEFAULT_TASK)
240230
})
241231
})
242232

243233
describe('getTask', () => {
244234
test('calls get request with expected url', async () => {
245235
const taskId = '12'
246-
const requestMock = setupRestClientMock(RAW_DEFAULT_TASK)
236+
const requestMock = setupRestClientMock(DEFAULT_TASK)
247237
const api = getTarget()
248238

249239
await api.getTask(taskId)
@@ -267,7 +257,7 @@ describe('TodoistApi task endpoints', () => {
267257

268258
test('calls get on expected endpoint with args', async () => {
269259
const requestMock = setupRestClientMock({
270-
results: [RAW_DEFAULT_TASK, TASK_WITH_OPTIONALS_AS_NULL],
260+
results: [DEFAULT_TASK, TASK_WITH_OPTIONALS_AS_NULL],
271261
nextCursor: '123',
272262
})
273263
const api = getTarget()
@@ -285,13 +275,13 @@ describe('TodoistApi task endpoints', () => {
285275
})
286276

287277
test('returns result from rest client', async () => {
288-
const tasks = [RAW_DEFAULT_TASK]
278+
const tasks = [DEFAULT_TASK]
289279
setupRestClientMock({ results: tasks, nextCursor: '123' })
290280
const api = getTarget()
291281

292282
const { results, nextCursor } = await api.getTasks(DEFAULT_GET_TASKS_ARGS)
293283

294-
expect(results).toEqual([DEFAULT_TASK])
284+
expect(results).toEqual(tasks)
295285
expect(nextCursor).toBe('123')
296286
})
297287
})
@@ -305,10 +295,7 @@ describe('TodoistApi task endpoints', () => {
305295
}
306296

307297
test('calls get request with expected url', async () => {
308-
const requestMock = setupRestClientMock({
309-
results: [RAW_DEFAULT_TASK],
310-
nextCursor: null,
311-
})
298+
const requestMock = setupRestClientMock({ results: [DEFAULT_TASK], nextCursor: null })
312299
const api = getTarget()
313300

314301
await api.getTasksByFilter(DEFAULT_GET_TASKS_BY_FILTER_ARGS)
@@ -324,7 +311,7 @@ describe('TodoistApi task endpoints', () => {
324311
})
325312

326313
test('returns result from rest client', async () => {
327-
setupRestClientMock({ results: [RAW_DEFAULT_TASK], nextCursor: null })
314+
setupRestClientMock({ results: [DEFAULT_TASK], nextCursor: null })
328315
const api = getTarget()
329316

330317
const response = await api.getTasksByFilter(DEFAULT_GET_TASKS_BY_FILTER_ARGS)
@@ -336,7 +323,7 @@ describe('TodoistApi task endpoints', () => {
336323
})
337324

338325
test('validates task array in response', async () => {
339-
const invalidTask = { ...RAW_DEFAULT_TASK, due: '2020-01-31' }
326+
const invalidTask = { ...DEFAULT_TASK, due: '2020-01-31' }
340327
setupRestClientMock({ results: [invalidTask], nextCursor: null })
341328
const api = getTarget()
342329

0 commit comments

Comments
 (0)