Skip to content

Commit ee881bb

Browse files
authored
feat: add test cases for POST /requests creating OOO request (#2386)
* feat: add test cases for creating OOO request * fix: skip test cases * fix: remove try-catch from tests * fix: test case
1 parent 6a4319c commit ee881bb

File tree

4 files changed

+291
-50
lines changed

4 files changed

+291
-50
lines changed

test/fixtures/oooRequest/oooRequest.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { REQUEST_STATE, REQUEST_TYPE } from "../../../constants/requests";
2+
// import { UserStatus } from "../../../types/userStatus";
23

34
export const createOooStatusRequests = {
45
type: "OOO",
@@ -19,6 +20,35 @@ export const validOooStatusRequests = {
1920
state: REQUEST_STATE.PENDING,
2021
};
2122

23+
// export const createdOOORequest = {
24+
// id: "Js7JnT6uRBLjGvSJM5X5",
25+
// type: validOooStatusRequests.type,
26+
// from: validOooStatusRequests.from,
27+
// until: validOooStatusRequests.until,
28+
// reason: validOooStatusRequests.reason,
29+
// status: "PENDING",
30+
// lastModifiedBy: null,
31+
// requestedBy: "suraj-maity-1",
32+
// userId: "jCqqOYCnm93mcmaYuSsQ",
33+
// comment: null
34+
// };
35+
36+
export const validUserCurrentStatus = {
37+
from: Date.now(),
38+
until: Date.now() + 1 * 24 * 60 * 60 * 1000,
39+
message: "",
40+
state: "ACTIVE",
41+
updatedAt: Date.now(),
42+
};
43+
44+
// export const testUserStatus: UserStatus = {
45+
// id: "wcl0ZLsnngKUNZY9GkCo",
46+
// data: {
47+
// currentStatus: validUserCurrentStatus
48+
// },
49+
// userStatusExists: true
50+
// };
51+
2252
export const invalidOooStatusRequests = {
2353
type: "OOO",
2454
from: Date.now() + 100000,
@@ -128,4 +158,4 @@ export const updateOooStatusRequest = [
128158
updatedAt: 1234567890,
129159
reason: "Approval granted.",
130160
},
131-
];
161+
];

test/integration/requests.test.ts

Lines changed: 161 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import app from "../../server";
77
import cleanDb from "../utils/cleanDb";
88
import authService from "../../services/authService";
99
import userDataFixture from "../fixtures/user/user";
10+
import sinon from "sinon";
1011
const cookieName = config.get("userToken.cookieName");
1112
import addUser from "../utils/addUser";
1213
import {
@@ -26,9 +27,15 @@ import {
2627
REQUEST_ALREADY_PENDING,
2728
REQUEST_REJECTED_SUCCESSFULLY,
2829
REQUEST_ALREADY_REJECTED,
30+
// UNAUTHORIZED_TO_CREATE_OOO_REQUEST,
31+
// USER_STATUS_NOT_FOUND,
32+
// OOO_STATUS_ALREADY_EXIST,
2933
} from "../../constants/requests";
3034
import { updateTask } from "../../models/tasks";
3135
import { validTaskAssignmentRequest, validTaskCreqtionRequest } from "../fixtures/taskRequests/taskRequests";
36+
import { deleteUserStatus, updateUserStatus } from "../../models/userStatus";
37+
import * as requestsQuery from "../../models/requests";
38+
import { userState } from "../../constants/userStatus";
3239

3340
const userData = userDataFixture();
3441
chai.use(chaiHttp);
@@ -41,12 +48,17 @@ let approvedOooRequestId: string;
4148
let oooRequestData: any;
4249
let oooRequestData2: any;
4350
let testUserId: string;
51+
let testArchivedUserId: string;
4452

4553
describe("/requests OOO", function () {
54+
55+
const requestsEndpoint: string = "/requests?dev=true";
56+
4657
beforeEach(async function () {
47-
const userIdPromises = [addUser(userData[16]), addUser(userData[4])];
48-
const [userId, superUserId] = await Promise.all(userIdPromises);
58+
const userIdPromises = [addUser(userData[16]), addUser(userData[4]), addUser(userData[18])];
59+
const [userId, superUserId, archivedUserId] = await Promise.all(userIdPromises);
4960
testUserId = userId;
61+
testArchivedUserId = archivedUserId;
5062

5163
oooRequestData = { ...createOooRequests, requestedBy: userId };
5264
oooRequestData2 = { ...createOooRequests2, requestedBy: superUserId };
@@ -69,137 +81,239 @@ describe("/requests OOO", function () {
6981
});
7082

7183
afterEach(async function () {
84+
sinon.restore();
7285
await cleanDb();
7386
});
7487

7588
describe("POST /requests", function () {
89+
7690
beforeEach(async function () {
7791
const userIdPromises = [addUser(userData[16])];
7892
const [userId] = await Promise.all(userIdPromises);
7993

8094
authToken = authService.generateAuthToken({ userId });
95+
96+
const testUserStatus = {
97+
currentStatus: {
98+
state: userState.ACTIVE
99+
}
100+
};
101+
102+
await updateUserStatus(userId, testUserStatus);
81103
});
82104

83105
afterEach(async function () {
84106
await cleanDb();
85107
});
86108

109+
it.skip("should return 501 and 'Feature not implemented' message when dev is false", function (done) {
110+
chai
111+
.request(app)
112+
.post("/requests?dev=false")
113+
.set("cookie", `${cookieName}=${authToken}`)
114+
.send(validOooStatusRequests)
115+
.end(function (err, res) {
116+
if (err) {
117+
return done(err);
118+
}
119+
expect(res.statusCode).to.equal(501);
120+
expect(res.body.message).to.equal("Feature not implemented");
121+
done();
122+
});
123+
});
124+
87125
it("should return 401 if user is not logged in", function (done) {
88126
chai
89127
.request(app)
90-
.post("/requests")
128+
.post(requestsEndpoint)
91129
.send(validOooStatusRequests)
92130
.end(function (err, res) {
93131
expect(res).to.have.status(401);
132+
expect(res.body.error).to.equal("Unauthorized");
133+
expect(res.body.message).to.equal("Unauthenticated User");
94134
done();
95135
});
96136
});
97137

98-
it("should create a new request", function (done) {
138+
it.skip("should return 403 if user is not part of discord", function (done) {
139+
const authTokenForArchivedUserId = authService.generateAuthToken(
140+
{ userId: testArchivedUserId }
141+
);
99142
chai
100143
.request(app)
101-
.post("/requests")
102-
.set("cookie", `${cookieName}=${authToken}`)
144+
.post(requestsEndpoint)
145+
.set("cookie", `${cookieName}=${authTokenForArchivedUserId}`)
103146
.send(validOooStatusRequests)
104147
.end(function (err, res) {
105-
expect(res).to.have.status(201);
106-
expect(res.body).to.have.property("message");
107-
expect(res.body.message).to.equal(REQUEST_CREATED_SUCCESSFULLY);
148+
expect(res).to.have.status(403);
149+
expect(res.body.error).to.equal("Forbidden");
150+
// expect(res.body.message).to.equal(UNAUTHORIZED_TO_CREATE_OOO_REQUEST);
108151
done();
109152
});
110153
});
111154

112-
it("should return 400, if already created request is created again", async function () {
113-
await chai
114-
.request(app)
115-
.post("/requests")
116-
.set("cookie", `${cookieName}=${authToken}`)
117-
.send(validOooStatusRequests);
118-
const response = await chai
119-
.request(app)
120-
.post("/requests")
155+
it("should return 500 response when creating OOO request fails", function (done) {
156+
sinon.stub(requestsQuery, "createRequest")
157+
.throws("Error while creating OOO request");
158+
chai.request(app)
159+
.post(requestsEndpoint)
121160
.set("cookie", `${cookieName}=${authToken}`)
122-
.send(validOooStatusRequests);
123-
expect(response).to.have.status(400);
124-
expect(response.body).to.have.property("message");
125-
expect(response.body.message).to.equal(REQUEST_ALREADY_PENDING);
161+
.send(validOooStatusRequests)
162+
.end(function (err, res) {
163+
if (err) return done(err);
164+
expect(res.statusCode).to.equal(500);
165+
expect(res.body.message).to.equal("An internal server error occurred");
166+
done();
167+
});
126168
});
127169

128-
it("should create a new request and have all the required fields in the response", function (done) {
170+
it.skip("should create a new request when dev is true", function (done) {
129171
chai
130172
.request(app)
131-
.post("/requests")
173+
.post(requestsEndpoint)
132174
.set("cookie", `${cookieName}=${authToken}`)
133175
.send(validOooStatusRequests)
134-
.end(function (err, res) {
176+
.end(async function (err, res) {
177+
if (err) return done(err);
135178
expect(res).to.have.status(201);
136179
expect(res.body).to.have.property("message");
137-
expect(Object.keys(res.body.data)).to.have.lengthOf(9);
138-
expect(res.body.data.until).to.be.above(res.body.data.from);
139-
expect(res.body.data).to.have.property("requestedBy");
140-
expect(res.body.data.type).to.equal(REQUEST_TYPE.OOO);
141-
expect(res.body.data.state).to.equal(REQUEST_STATE.PENDING);
142180
expect(res.body.message).to.equal(REQUEST_CREATED_SUCCESSFULLY);
181+
expect(res.body).to.not.have.property("data");
182+
183+
await requestsQuery.getRequestByKeyValues({
184+
userId: testUserId,
185+
type: REQUEST_TYPE.OOO,
186+
status: REQUEST_STATE.PENDING
187+
}).then((request) => {
188+
expect(request).to.not.be.null;
189+
// expect(request.reason).to.equal(validOooStatusRequests.reason);
190+
done();
191+
}).catch(done);
192+
});
193+
});
194+
195+
it("should return error if invalid type is passed", function (done) {
196+
const type = "ACTIVE";
197+
chai
198+
.request(app)
199+
.post(requestsEndpoint)
200+
.set("cookie", `${cookieName}=${authToken}`)
201+
.send({ ...validOooStatusRequests, type })
202+
.end(function (err, res) {
203+
expect(res).to.have.status(400);
204+
expect(res.body).to.have.property("message");
205+
expect(res.body.message).to.equal(`Invalid request type: ${type}`);
143206
done();
144207
});
145208
});
146209

147-
it("should create a new request", function (done) {
210+
it("should return 400 when until date is smalller than from date in request body", function (done) {
148211
chai
149212
.request(app)
150-
.post("/requests")
213+
.post(requestsEndpoint)
151214
.set("cookie", `${cookieName}=${authToken}`)
152-
.send(validOooStatusRequests)
215+
.send({...validOooStatusRequests, until: Date.now()})
153216
.end(function (err, res) {
154-
expect(res).to.have.status(201);
217+
if (err) return done(err);
218+
expect(res).to.have.status(400);
155219
expect(res.body).to.have.property("message");
156-
expect(res.body.message).to.equal(REQUEST_CREATED_SUCCESSFULLY);
220+
expect(res.body.message).to.equal("until date must be greater than or equal to from date");
157221
done();
158222
});
159223
});
160224

161-
it("should return error if invalid type is passed", function (done) {
162-
const type = "ACTIVE";
225+
it("should return 400 when from date is less than today's date in request body", function (done) {
163226
chai
164227
.request(app)
165-
.post("/requests")
228+
.post(requestsEndpoint)
166229
.set("cookie", `${cookieName}=${authToken}`)
167-
.send({ ...validOooStatusRequests, type })
230+
.send({...validOooStatusRequests, from: Date.now() - 1 * 24 * 60 * 60 * 1000 })
168231
.end(function (err, res) {
232+
if (err) return done(err);
169233
expect(res).to.have.status(400);
170234
expect(res.body).to.have.property("message");
171-
expect(res.body.message).to.equal(`Invalid request type: ${type}`);
235+
expect(res.body.message).to.equal("from date must be greater than or equal to Today's date");
172236
done();
173237
});
174238
});
175239

176-
it("should return error if message is not present in body", function (done) {
240+
it("should return 400 when message field is missing in request body", function (done) {
177241
chai
178242
.request(app)
179-
.post("/requests")
243+
.post(requestsEndpoint)
180244
.set("cookie", `${cookieName}=${authToken}`)
181245
.send(_.omit(validOooStatusRequests, "message"))
182246
.end(function (err, res) {
247+
if (err) return done(err);
183248
expect(res).to.have.status(400);
184249
expect(res.body).to.have.property("message");
185250
expect(res.body.message).to.equal("message is required");
186251
done();
187252
});
188253
});
189254

190-
it("should return error if state in the body is not PENDING", function (done) {
255+
it("should return 400 with error when status field is included in request body", function (done) {
191256
chai
192257
.request(app)
193-
.post("/requests")
258+
.post(requestsEndpoint)
194259
.set("cookie", `${cookieName}=${authToken}`)
195-
.send({ ...validOooStatusRequests, state: REQUEST_STATE.APPROVED })
260+
.send({ ...validOooStatusRequests, status: REQUEST_STATE.APPROVED })
196261
.end(function (err, res) {
262+
if (err) return done(err);
197263
expect(res).to.have.status(400);
198264
expect(res.body).to.have.property("message");
199-
expect(res.body.message).to.equal("state must be PENDING");
265+
expect(res.body.message).to.equal(`"status" is not allowed`);
200266
done();
201267
});
202268
});
269+
270+
it.skip("should return 404 with error when user status not found", async function () {
271+
await deleteUserStatus(testUserId);
272+
const response = await chai
273+
.request(app)
274+
.post(requestsEndpoint)
275+
.set("cookie", `${cookieName}=${authToken}`)
276+
.send(validOooStatusRequests);
277+
278+
expect(response).to.have.status(404);
279+
expect(response.body).to.have.property("message");
280+
// expect(response.body.message).to.equal(USER_STATUS_NOT_FOUND);
281+
});
282+
283+
it.skip("should return 403 with error when user status is already OOO", async function () {
284+
const testOOOUserStatus = {
285+
currentStatus: {
286+
state: userState.OOO
287+
}
288+
};
289+
await updateUserStatus(testUserId, testOOOUserStatus);
290+
const response = await chai
291+
.request(app)
292+
.post(requestsEndpoint)
293+
.set("cookie", `${cookieName}=${authToken}`)
294+
.send(validOooStatusRequests);
295+
296+
expect(response).to.have.status(403);
297+
expect(response.body).to.have.property("message");
298+
// expect(response.body.message).to.equal(OOO_STATUS_ALREADY_EXIST);
299+
});
300+
301+
it.skip("should return 409 with error when user already have pending OOO request", async function () {
302+
await chai
303+
.request(app)
304+
.post(requestsEndpoint)
305+
.set("cookie", `${cookieName}=${authToken}`)
306+
.send(validOooStatusRequests);
307+
const response = await chai
308+
.request(app)
309+
.post(requestsEndpoint)
310+
.set("cookie", `${cookieName}=${authToken}`)
311+
.send(validOooStatusRequests);
312+
313+
expect(response).to.have.status(409);
314+
expect(response.body).to.have.property("message");
315+
expect(response.body.message).to.equal(REQUEST_ALREADY_PENDING);
316+
});
203317
});
204318

205319
describe("PUT /requests/:id", function () {
@@ -827,4 +941,4 @@ describe("/requests Task", function () {
827941
});
828942
});
829943
});
830-
});
944+
});

test/unit/middlewares/oooRequests.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const { expect } = chai;
55
import {
66
createOooStatusRequestValidator,
77
} from "./../../../middlewares/validators/oooRequests";
8-
import { validOooStatusRequests, validOooStatusUpdate } from "../../fixtures/oooRequest/oooRequest";
8+
import { validOooStatusRequests } from "../../fixtures/oooRequest/oooRequest";
99

1010
describe("OOO Status Request Validators", function () {
1111
let req: any;
@@ -89,4 +89,4 @@ describe("OOO Status Request Validators", function () {
8989
}
9090
});
9191
});
92-
});
92+
});

0 commit comments

Comments
 (0)