Skip to content

Commit 6f1e4f3

Browse files
committed
adds tests for user progresses collection GET and POST
1 parent 24a1110 commit 6f1e4f3

File tree

2 files changed

+251
-0
lines changed

2 files changed

+251
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
const standupProgressDay1 = {
2+
type: "user",
3+
completed: "Working on a backend Go project",
4+
planned: "Implement error handling for API endpoints",
5+
blockers: "Waiting for database access credentials",
6+
};
7+
8+
const standupProgressDay2 = {
9+
type: "user",
10+
completed: "Completed API integration for user authentication",
11+
planned: "Optimize database queries for improved performance",
12+
blockers: "None",
13+
};
14+
15+
const incompleteProgress = [
16+
{
17+
missingField: "type",
18+
payload: {
19+
completed: "Implemented caching mechanism for frequent API requests",
20+
planned: "Refactor code to follow coding best practices",
21+
blockers: "Waiting for feedback from the code review",
22+
},
23+
},
24+
{
25+
missingField: "completed",
26+
payload: {
27+
type: "user",
28+
planned: "Refactor code to follow coding best practices",
29+
blockers: "Waiting for feedback from the code review",
30+
},
31+
},
32+
{
33+
missingField: "planned",
34+
payload: {
35+
type: "user",
36+
completed: "Implemented caching mechanism for frequent API requests",
37+
blockers: "Waiting for feedback from the code review",
38+
},
39+
},
40+
{
41+
missingField: "blockers",
42+
payload: {
43+
type: "user",
44+
completed: "Implemented caching mechanism for frequent API requests",
45+
planned: "Refactor code to follow coding best practices",
46+
},
47+
},
48+
];
49+
50+
const stubbedModelProgressData = (userId, createdAt, date) => {
51+
return [
52+
{
53+
userId,
54+
createdAt,
55+
date,
56+
type: "user",
57+
completed: "Implemented caching mechanism for frequent API requests",
58+
planned: "Refactor code to follow coding best practices",
59+
blockers: "Waiting for feedback from the code review",
60+
},
61+
];
62+
};
63+
64+
module.exports = { standupProgressDay1, standupProgressDay2, incompleteProgress, stubbedModelProgressData };
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
const chai = require("chai");
2+
const sinon = require("sinon");
3+
4+
const firestore = require("../../utils/firestore");
5+
const app = require("../../server");
6+
const authService = require("../../services/authService");
7+
8+
const addUser = require("../utils/addUser");
9+
const cleanDb = require("../utils/cleanDb");
10+
const {
11+
standupProgressDay1,
12+
standupProgressDay2,
13+
incompleteProgress,
14+
stubbedModelProgressData,
15+
} = require("../fixtures/progress/userProgress");
16+
17+
const userData = require("../fixtures/user/user")();
18+
19+
const cookieName = config.get("userToken.cookieName");
20+
const { expect } = chai;
21+
22+
// eslint-disable-next-line mocha/no-skipped-tests
23+
describe.skip("Test Progress Updates API", function () {
24+
afterEach(async function () {
25+
await cleanDb();
26+
});
27+
28+
describe("Test the POST Call", function () {
29+
let clock;
30+
let testUserId;
31+
let testUserJwt;
32+
beforeEach(async function () {
33+
clock = sinon.useFakeTimers({
34+
now: new Date(2023, 5, 2).getTime(),
35+
toFake: ["Date"],
36+
});
37+
testUserId = await addUser(userData[1]);
38+
testUserJwt = authService.generateAuthToken({ userId: testUserId });
39+
});
40+
41+
afterEach(function () {
42+
clock.restore();
43+
});
44+
45+
it("Stores the initial progress entry for the day and disregards any subsequent entries made before 6 am of the next day", async function () {
46+
const responseFirstDay = await chai
47+
.request(app)
48+
.post(`progresses`)
49+
.set("Cookie", `${cookieName}=${testUserJwt}`)
50+
.send(standupProgressDay1);
51+
52+
expect(responseFirstDay).to.have.status(200);
53+
expect(responseFirstDay.body).to.have.keys(["message", "data"]);
54+
expect(responseFirstDay.body.data).to.have.keys([
55+
"id",
56+
"userId",
57+
"type",
58+
"completed",
59+
"planned",
60+
"blockers",
61+
"createdAt",
62+
"date",
63+
]);
64+
expect(responseFirstDay.body.message).to.be.equal("Standup progress created successfully");
65+
expect(responseFirstDay.body.data.userId).to.be.equal(testUserId);
66+
67+
// subsequent entry made for the same day
68+
const responseDuplicateEntry = await chai
69+
.request(app)
70+
.post(`progresses`)
71+
.set("Cookie", `${cookieName}=${testUserJwt}`)
72+
.send(standupProgressDay2);
73+
74+
expect(responseDuplicateEntry).to.have.status(400);
75+
expect(responseDuplicateEntry.body).to.have.keys(["message", "error"]);
76+
expect(responseDuplicateEntry.body.error).to.be.equal("Standup entry already exists for the day");
77+
expect(responseDuplicateEntry.body.message).to.be.equal("You can only add one standup entry per day");
78+
79+
// entry for the next day before 6 am
80+
clock.setSystemTime(new Date(2022, 5, 3).getTime());
81+
82+
const responseFirstNextDayEntry = await chai
83+
.request(app)
84+
.post(`progresses`)
85+
.set("Cookie", `${cookieName}=${testUserJwt}`)
86+
.send(standupProgressDay2);
87+
88+
expect(responseFirstNextDayEntry).to.have.status(400);
89+
expect(responseFirstNextDayEntry.body).to.have.keys(["message", "error"]);
90+
expect(responseFirstNextDayEntry.body.error).to.be.equal("Standup entry already exists for the day");
91+
expect(responseFirstNextDayEntry.body.message).to.be.equal("You can only add one standup entry per day");
92+
93+
// entry for the next day after 6 am
94+
clock.setSystemTime(new Date(2022, 5, 3, 6, 30).getTime());
95+
96+
const responseSecondNextDayEntry = await chai
97+
.request(app)
98+
.post(`progresses`)
99+
.set("Cookie", `${cookieName}=${testUserJwt}`)
100+
.send(standupProgressDay2);
101+
expect(responseSecondNextDayEntry).to.have.status(200);
102+
expect(responseSecondNextDayEntry.body).to.have.keys(["message", "data"]);
103+
expect(responseSecondNextDayEntry.body.data).to.have.keys([
104+
"id",
105+
"userId",
106+
"type",
107+
"completed",
108+
"planned",
109+
"blockers",
110+
"createdAt",
111+
"date",
112+
]);
113+
expect(responseSecondNextDayEntry.body.message).to.be.equal("Standup progress created successfully");
114+
expect(responseSecondNextDayEntry.body.data.userId).to.be.equal(testUserId);
115+
});
116+
117+
it("Gives 400 for invalid request body", function (done) {
118+
const requests = incompleteProgress.map((progress) => {
119+
return chai
120+
.request(app)
121+
.post(`progresses`)
122+
.set("Cookie", `${cookieName}=${testUserJwt}`)
123+
.send(progress.payload)
124+
.then((res) => {
125+
expect(res).to.have.status(400);
126+
expect(res.body.message).to.include(`Required field '${progress.missingField}' is missing`);
127+
});
128+
});
129+
130+
Promise.all(requests)
131+
.then(() => done())
132+
.catch((err) => done(err));
133+
});
134+
135+
it("Gives 401 for unauthenticated user", function (done) {
136+
chai
137+
.request(app)
138+
.post(`progresses`)
139+
.send(standupProgressDay1)
140+
.end((err, res) => {
141+
if (err) return done(err);
142+
expect(res).to.have.status(401);
143+
expect(res.body.message).to.be.equal("Access denied: User authentication is required");
144+
return done();
145+
});
146+
});
147+
});
148+
149+
describe("Test the GET Call", function () {
150+
let testUserId;
151+
152+
beforeEach(async function () {
153+
testUserId = await addUser(userData[1]);
154+
const progressData = stubbedModelProgressData(testUserId, Date.now(), Date.now());
155+
await firestore.collection("progresses").doc("testProgressDocument").set(progressData);
156+
});
157+
158+
it("Returns the progress array for the user", function (done) {
159+
chai
160+
.request(app)
161+
.get(`/progresses?userId=${testUserId}`)
162+
.end((err, res) => {
163+
if (err) return done(err);
164+
expect(res).to.have.status(200);
165+
expect(res.body).to.have.keys(["message", "data"]);
166+
expect(res.body.data).to.be.an("array");
167+
expect(res.body.message).to.be.equal("Progress data retrieved successfully");
168+
res.body.data.forEach((progress) => {
169+
expect(progress).to.have.keys(["type", "completed", "planned", "blockers", "userId", "createdAt", "date"]);
170+
});
171+
return done();
172+
});
173+
});
174+
175+
it("Returns 404 for invalid user id", function (done) {
176+
chai
177+
.request(app)
178+
.get(`/progresses?userId=invalidUserId`)
179+
.end((err, res) => {
180+
if (err) return done(err);
181+
expect(res).to.have.status(404);
182+
expect(res.body.message).to.be.equal("UserId couldn't be retrieved");
183+
return done();
184+
});
185+
});
186+
});
187+
});

0 commit comments

Comments
 (0)