Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit 645a5f9

Browse files
authored
Merge pull request #16 from dubisdev/dubisdev/issue13
tests: add tests fix: Task default name closes #13
2 parents 5c37521 + f9549d5 commit 645a5f9

File tree

12 files changed

+254
-14
lines changed

12 files changed

+254
-14
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/node_modules
2-
/dist
2+
/dist
3+
.env

.npmignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/src
33
/.github
44
.gitignore
5+
.env
56

67
# Config files
78
/node_modules

jest.config.mjs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
/*
2-
* For a detailed explanation regarding each configuration property, visit:
3-
* https://jestjs.io/docs/configuration
4-
*/
1+
import dotenv from "dotenv";
2+
dotenv.config();
53

64
export default {
75
extensionsToTreatAsEsm: [".ts"],
@@ -14,7 +12,7 @@ export default {
1412
moduleNameMapper: {
1513
"^(\\.{1,2}/.*)\\.js$": "$1",
1614
},
17-
15+
1816
preset: "ts-jest/presets/js-with-ts-esm",
1917
rootDir: "src",
2018
};

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,11 @@
1212
"rest-client"
1313
],
1414
"dependencies": {
15-
"axios": "^0.23.0"
15+
"axios": "^0.24.0"
1616
},
1717
"devDependencies": {
1818
"@types/jest": "^27.0.2",
19+
"dotenv": "^10.0.0",
1920
"jest": "^27.3.0",
2021
"ts-jest": "^27.0.7",
2122
"typescript": "^4.4.4"

src/TDSClient.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import task from "./submodules/task";
22
import project from "./submodules/project";
33

4-
const TDSClientConstructor = (apiToken = ""): TDSClient => {
4+
const TDSClientConstructor: ClientConstructor = (apiToken): TDSClient => {
55
if (!apiToken) throw new Error("Missing api token");
66

77
const headers = { Authorization: `Bearer ${apiToken}` };

src/__tests__/projects.tests.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import TDSClient, { Project } from "..";
2+
3+
const myClient = TDSClient(process.env.TODOIST_TOKEN);
4+
5+
const generalExpectedProject = Project({
6+
name: "P1",
7+
});
8+
let generalExpectedProjectID: number;
9+
10+
describe("Client-Side Project Creation", () => {
11+
test("Create Empty Project", () => {
12+
const emptyProject = Project();
13+
expect(emptyProject).toMatchObject<ClientCreatedProject>({
14+
name: "_No_Project_Name_Provided_",
15+
});
16+
});
17+
18+
test("Create Normal Project", () => {
19+
expect(generalExpectedProject).toMatchObject<ClientCreatedProject>({
20+
name: "P1",
21+
});
22+
});
23+
});
24+
25+
describe("API Project Functions", () => {
26+
// 1 active project now (Inbox)
27+
28+
test("Create A Project", async () => {
29+
// creates the project in the server
30+
31+
let apiProject = await myClient.project.create(generalExpectedProject);
32+
33+
expect(apiProject.id).toBeTruthy();
34+
35+
generalExpectedProjectID = apiProject.id;
36+
});
37+
38+
test("Get A Project", async () => {
39+
let apiProject = await myClient.project.get(generalExpectedProjectID);
40+
41+
expect(apiProject.name).toBe(generalExpectedProject.name);
42+
});
43+
44+
// 2 active projects now
45+
test("Create Two Projects", async () => {
46+
await myClient.project.create({ name: "P2" });
47+
await myClient.project.create({ name: "P3" });
48+
});
49+
50+
// 4 active projects now
51+
test("Get All Active Projects JSON", async () => {
52+
const responseProjects = await myClient.project.getAllJSON();
53+
const firstProjectExists = responseProjects.some(
54+
(projectObj) => projectObj.name === "P1"
55+
);
56+
const secondProjectExists = responseProjects.some(
57+
(projectObj) => projectObj.name === "P2"
58+
);
59+
const thirdProjectExists = responseProjects.some(
60+
(projectObj) => projectObj.name === "P3"
61+
);
62+
63+
expect(responseProjects.length).toBe(4);
64+
expect(typeof responseProjects[0]).toBe("object");
65+
66+
expect(firstProjectExists).toBe(true);
67+
expect(secondProjectExists).toBe(true);
68+
expect(thirdProjectExists).toBe(true);
69+
});
70+
71+
test("Get All Active Project Names", async () => {
72+
const responseProjects = await myClient.project.getAll();
73+
const firstProjectExists = responseProjects.some((name) => name === "P1");
74+
const secondProjectExists = responseProjects.some((name) => name === "P2");
75+
const thirdProjectExists = responseProjects.some((name) => name === "P3");
76+
77+
expect(responseProjects.length).toBe(4);
78+
expect(typeof responseProjects[0]).toBe("string");
79+
80+
expect(firstProjectExists).toBe(true);
81+
expect(secondProjectExists).toBe(true);
82+
expect(thirdProjectExists).toBe(true);
83+
});
84+
85+
// 4 active projects now (3 + inbox)
86+
});

src/__tests__/task.tests.ts

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import TDSClient, { Task } from "..";
2+
3+
const myClient = TDSClient(process.env.TODOIST_TOKEN);
4+
5+
const generalExpectedTask = Task({
6+
content: "Hello world",
7+
});
8+
let generalExpectedTaskID: number;
9+
10+
describe("Client-Side Task Creation", () => {
11+
test("Create Empty Task", () => {
12+
const emptyTask = Task();
13+
expect(emptyTask).toMatchObject<ClientCreatedTask>({
14+
content: "_No_Task_Name_Provided_",
15+
});
16+
});
17+
18+
test("Create Normal Task", () => {
19+
expect(generalExpectedTask).toMatchObject<ClientCreatedTask>({
20+
content: "Hello world",
21+
});
22+
});
23+
});
24+
25+
describe("API Tasks Functions", () => {
26+
test("Create A Task", async () => {
27+
// creates the task in the server
28+
29+
let apiTask = await myClient.task
30+
.create(generalExpectedTask)
31+
// @ts-ignore: Task.create should return APITaskObject
32+
.then((res) => res.data as APITaskObject);
33+
34+
expect(apiTask.id).toBeTruthy();
35+
36+
//fix needed --> task.create should return an APITaskObject --> issue #15
37+
38+
/*
39+
let apiTask = await myClient.task.create(generalExpectedTask);
40+
expect(apiTask).toMatchObject<APITaskObject>({
41+
...apiTask,
42+
content: "Hello world",
43+
});
44+
45+
save the task id for next tests
46+
generalExpectedTaskID = apiTask.id;*/
47+
48+
//save the task id for next tests
49+
generalExpectedTaskID = apiTask.id;
50+
});
51+
52+
test("Get A Task", async () => {
53+
let apiTask = await myClient.task.get(generalExpectedTaskID);
54+
55+
expect(apiTask.content).toBe(generalExpectedTask.content);
56+
});
57+
58+
test("Close A Task", async () => {
59+
let status = (await myClient.task.closeTask(generalExpectedTaskID)).status;
60+
61+
expect(status).toBe(204);
62+
});
63+
64+
// no active tasks now
65+
test("Create Two Tasks", async () => {
66+
await myClient.task.create({ content: "First task" });
67+
await myClient.task.create({ content: "Second task" });
68+
});
69+
70+
test("Get All Active Tasks JSON", async () => {
71+
const responseTasks = await myClient.task.getAllJSON();
72+
const firstTaskExists = responseTasks.some(
73+
(taskObj) => taskObj.content === "First task"
74+
);
75+
const secondTaskExists = responseTasks.some(
76+
(taskObj) => taskObj.content === "Second task"
77+
);
78+
79+
expect(responseTasks.length).toBe(2);
80+
81+
expect(firstTaskExists).toBe(true);
82+
expect(secondTaskExists).toBe(true);
83+
});
84+
85+
test("Get All Active Tasks Names", async () => {
86+
const responseTasks = await myClient.task.getAll();
87+
const firstTaskExists = responseTasks.some((name) => name === "First task");
88+
const secondTaskExists = responseTasks.some(
89+
(name) => name === "Second task"
90+
);
91+
92+
expect(responseTasks.length).toBe(2);
93+
94+
expect(firstTaskExists).toBe(true);
95+
expect(secondTaskExists).toBe(true);
96+
});
97+
98+
test("Complete All Previous Tasks", async () => {
99+
let allTasksJSON = await myClient.task.getAllJSON();
100+
101+
for (let i = 0; i < allTasksJSON.length; ++i) {
102+
let status = (await myClient.task.closeTask(allTasksJSON[i].id)).status;
103+
expect(status).toBe(204);
104+
}
105+
});
106+
107+
// no active tasks now
108+
/* Not working now because of #19
109+
test("Create Two Tasks For Today", async () => {
110+
// create tasks in today inbox
111+
const due_info = {
112+
due_lang: "en",
113+
due_string: "today",
114+
};
115+
await myClient.task.create({ content: "First task", ...due_info });
116+
await myClient.task.create({ content: "Second task", ...due_info });
117+
118+
//get created tasks
119+
let allTodayJSON = await myClient.task.getTodayJSON();
120+
const firstTaskExists = allTodayJSON.some(
121+
(taskObj) => taskObj.content === "First task"
122+
);
123+
const secondTaskExists = allTodayJSON.some(
124+
(taskObj) => taskObj.content === "Second task"
125+
);
126+
127+
console.log(allTodayJSON);
128+
129+
expect(allTodayJSON.length).toBe(2);
130+
expect(typeof allTodayJSON[0]).toBe("object");
131+
expect(firstTaskExists).toBe(true);
132+
expect(secondTaskExists).toBe(true);
133+
});
134+
*/
135+
});

src/definitions/APIResponses.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,12 @@ declare interface APITaskObject {
3636
parent_id: number;
3737
url: string;
3838
}
39+
40+
declare interface AxiosResponse<T = any, D = any> {
41+
data: T;
42+
status: number;
43+
statusText: string;
44+
headers: AxiosResponseHeaders;
45+
config: AxiosRequestConfig<D>;
46+
request?: any;
47+
}

src/definitions/Client.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@ declare interface TDSClient {
33
task: TaskModule;
44
project: ProjectModule;
55
}
6+
7+
declare interface ClientConstructor {
8+
(apiToken?: string): TDSClient;
9+
}

src/definitions/Submodules.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ declare interface TaskModule {
1111
create: (
1212
task?: UserCreatedTask | ClientCreatedTask
1313
) => Promise<APITaskObject>;
14-
closeTask: (id: number | string) => Promise<void>;
14+
closeTask: (id: number | string) => Promise<AxiosResponse>;
1515
getAll: () => Promise<string[]>;
1616
getAllJSON: () => Promise<APITaskObject[]>;
1717
getToday: () => Promise<string[]>;

0 commit comments

Comments
 (0)