Skip to content

Commit 80ef6f8

Browse files
committed
feat: add tests for PATCH OOO request
1 parent 1d4b457 commit 80ef6f8

File tree

4 files changed

+411
-2
lines changed

4 files changed

+411
-2
lines changed

test/fixtures/oooRequest/oooRequest.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,17 @@ export const updateOooStatusRequest = [
129129
reason: "Approval granted.",
130130
},
131131
];
132+
133+
export const createOooRequests3 = {
134+
from: Date.now() + 100000,
135+
until: Date.now() + 200000,
136+
type: "OOO",
137+
requestedBy: "testUser",
138+
reason: "Out of office for personal emergency.",
139+
status: REQUEST_STATE.PENDING
140+
};
141+
142+
export const acknowledgeOooRequest = {
143+
status: REQUEST_STATE.APPROVED,
144+
comment: "OOO request approved as it's emergency."
145+
};

test/integration/requests.test.ts

Lines changed: 193 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import chai from "chai";
22
const { expect } = chai;
3+
import sinon from "sinon";
34
import chaiHttp from "chai-http";
45
import _ from "lodash";
56
import config from "config";
@@ -14,6 +15,8 @@ import {
1415
validOooStatusRequests,
1516
validOooStatusUpdate,
1617
createOooRequests2,
18+
acknowledgeOooRequest,
19+
createOooRequests3,
1720
} from "../fixtures/oooRequest/oooRequest";
1821
import { createRequest, updateRequest } from "../../models/requests";
1922
import {
@@ -26,10 +29,12 @@ import {
2629
REQUEST_ALREADY_PENDING,
2730
REQUEST_REJECTED_SUCCESSFULLY,
2831
REQUEST_ALREADY_REJECTED,
32+
UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST,
33+
INVALID_REQUEST_TYPE,
2934
} from "../../constants/requests";
3035
import { updateTask } from "../../models/tasks";
3136
import { validTaskAssignmentRequest, validTaskCreqtionRequest } from "../fixtures/taskRequests/taskRequests";
32-
37+
import * as logUtils from "../../services/logService";
3338
const userData = userDataFixture();
3439
chai.use(chaiHttp);
3540

@@ -41,12 +46,14 @@ let approvedOooRequestId: string;
4146
let oooRequestData: any;
4247
let oooRequestData2: any;
4348
let testUserId: string;
49+
let testSuperUserId: string;
4450

4551
describe("/requests OOO", function () {
4652
beforeEach(async function () {
4753
const userIdPromises = [addUser(userData[16]), addUser(userData[4])];
4854
const [userId, superUserId] = await Promise.all(userIdPromises);
4955
testUserId = userId;
56+
testSuperUserId = superUserId;
5057

5158
oooRequestData = { ...createOooRequests, requestedBy: userId };
5259
oooRequestData2 = { ...createOooRequests2, requestedBy: superUserId };
@@ -186,6 +193,191 @@ describe("/requests OOO", function () {
186193
});
187194
});
188195

196+
describe("PATCH /requests/:id", function () {
197+
let pendingOooRequestId1: string;
198+
let oooRequestData3: any;
199+
let invalidRequestId: string;
200+
let approvedOooRequestId: string;
201+
let rejectedOooRequestId: string;
202+
203+
beforeEach(async function () {
204+
oooRequestData3 = { ...createOooRequests3, requestedBy: testUserId };
205+
206+
const { id: pendingOooId1 }: any = await createRequest(oooRequestData3);
207+
pendingOooRequestId1 = pendingOooId1;
208+
209+
const { id: pendingOooId2 }: any = await createRequest(oooRequestData3);
210+
211+
const { id: pendingOooId3 }: any = await createRequest(oooRequestData3);
212+
213+
const { id: invalidId }: any = await createRequest({...oooRequestData3, type: "XYZ"});
214+
invalidRequestId = invalidId;
215+
216+
const { id: approvedOooId }: any = await updateRequest(pendingOooId2, { status: REQUEST_STATE.APPROVED }, testSuperUserId, REQUEST_TYPE.OOO);
217+
approvedOooRequestId = approvedOooId;
218+
219+
const { id: rejectedOooId }: any = await updateRequest(pendingOooId3, { status: REQUEST_STATE.REJECTED }, testSuperUserId, REQUEST_TYPE.OOO);
220+
rejectedOooRequestId = rejectedOooId;
221+
});
222+
223+
it("should return 401 if user is not logged in", function (done) {
224+
chai
225+
.request(app)
226+
.patch(`/requests/${pendingOooRequestId1}?dev=true`)
227+
.send(acknowledgeOooRequest)
228+
.end(function (err, res) {
229+
expect(res).to.have.status(401);
230+
expect(res.body.error).to.equal("Unauthorized");
231+
expect(res.body.message).to.equal("Unauthenticated User");
232+
done();
233+
});
234+
});
235+
236+
it("should return 501 and 'Feature not implemented' message when dev is false", function (done) {
237+
chai
238+
.request(app)
239+
.patch(`/requests/${pendingOooRequestId1}?dev=false`)
240+
.set("cookie", `${cookieName}=${superUserToken}`)
241+
.send(acknowledgeOooRequest)
242+
.end(function (err, res) {
243+
if (err) {
244+
return done(err);
245+
}
246+
expect(res.statusCode).to.equal(501);
247+
expect(res.body.message).to.equal("Feature not implemented");
248+
done();
249+
});
250+
});
251+
252+
it("should return 404 if request does not exist", function (done) {
253+
chai
254+
.request(app)
255+
.patch(`/requests/111111?dev=true`)
256+
.set("cookie", `${cookieName}=${superUserToken}`)
257+
.send(acknowledgeOooRequest)
258+
.end(function (err, res) {
259+
if (err) {
260+
return done(err);
261+
}
262+
expect(res.statusCode).to.equal(404);
263+
expect(res.body.message).to.equal(REQUEST_DOES_NOT_EXIST);
264+
done();
265+
});
266+
});
267+
268+
it("should return 401 if user does not have super user permission", function (done) {
269+
chai
270+
.request(app)
271+
.patch(`/requests/${pendingOooRequestId1}?dev=true`)
272+
.set("cookie", `${cookieName}=${authToken}`)
273+
.send(acknowledgeOooRequest)
274+
.end(function (err, res) {
275+
if (err) {
276+
return done(err);
277+
}
278+
expect(res.statusCode).to.equal(401);
279+
expect(res.body.message).to.equal(UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST);
280+
done();
281+
});
282+
});
283+
284+
it("should return 400 if OOO request is already approved", function (done) {
285+
chai
286+
.request(app)
287+
.patch(`/requests/${approvedOooRequestId}?dev=true`)
288+
.set("cookie", `${cookieName}=${superUserToken}`)
289+
.send(acknowledgeOooRequest)
290+
.end(function (err, res) {
291+
if (err) {
292+
return done(err);
293+
}
294+
expect(res.statusCode).to.equal(400);
295+
expect(res.body.message).to.equal(REQUEST_ALREADY_APPROVED);
296+
done();
297+
});
298+
});
299+
300+
it("should return 400 if OOO request is already rejected", function (done) {
301+
chai
302+
.request(app)
303+
.patch(`/requests/${rejectedOooRequestId}?dev=true`)
304+
.set("cookie", `${cookieName}=${superUserToken}`)
305+
.send(acknowledgeOooRequest)
306+
.end(function (err, res) {
307+
if (err) {
308+
return done(err);
309+
}
310+
expect(res.statusCode).to.equal(400);
311+
expect(res.body.message).to.equal(REQUEST_ALREADY_REJECTED);
312+
done();
313+
});
314+
});
315+
316+
it("should return 400 if request type is not OOO", function (done) {
317+
chai
318+
.request(app)
319+
.patch(`/requests/${invalidRequestId}?dev=true`)
320+
.set("cookie", `${cookieName}=${superUserToken}`)
321+
.send(acknowledgeOooRequest)
322+
.end(function (err, res) {
323+
if (err) {
324+
return done(err);
325+
}
326+
expect(res.statusCode).to.equal(400);
327+
expect(res.body.message).to.equal(INVALID_REQUEST_TYPE);
328+
done();
329+
});
330+
});
331+
332+
it("should approve OOO request when dev is true", function (done) {
333+
chai
334+
.request(app)
335+
.patch(`/requests/${pendingOooRequestId1}?dev=true`)
336+
.set("cookie", `${cookieName}=${superUserToken}`)
337+
.send(acknowledgeOooRequest)
338+
.end(function (err, res) {
339+
if (err) {
340+
return done(err);
341+
}
342+
expect(res.statusCode).to.equal(200);
343+
expect(res.body.message).to.equal(REQUEST_APPROVED_SUCCESSFULLY);
344+
done();
345+
});
346+
});
347+
348+
it("should reject OOO request when dev is true", function (done) {
349+
chai
350+
.request(app)
351+
.patch(`/requests/${pendingOooRequestId1}?dev=true`)
352+
.set("cookie", `${cookieName}=${superUserToken}`)
353+
.send({...acknowledgeOooRequest, status: REQUEST_STATE.REJECTED})
354+
.end(function (err, res) {
355+
if (err) {
356+
return done(err);
357+
}
358+
expect(res.statusCode).to.equal(200);
359+
expect(res.body.message).to.equal(REQUEST_REJECTED_SUCCESSFULLY);
360+
done();
361+
});
362+
});
363+
364+
it("should return 500 response for unexpected error", function (done) {
365+
sinon.stub(logUtils, "addLog").throws("Error");
366+
chai
367+
.request(app)
368+
.patch(`/requests/${pendingOooRequestId1}?dev=true`)
369+
.set("cookie", `${cookieName}=${superUserToken}`)
370+
.send(acknowledgeOooRequest)
371+
.end(function (err, res) {
372+
if (err) return done(err);
373+
expect(res.statusCode).to.equal(500);
374+
expect(res.body.error).to.equal("Internal Server Error");
375+
expect(res.body.message).to.equal("An internal server error occurred");
376+
done();
377+
});
378+
});
379+
});
380+
189381
describe("PUT /requests/:id", function () {
190382
it("should return 401 if user is not logged in", function (done) {
191383
chai

test/unit/middlewares/oooRequests.test.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ const { expect } = chai;
44

55
import {
66
createOooStatusRequestValidator,
7+
acknowledgeOOORequestsValidator,
78
} from "./../../../middlewares/validators/oooRequests";
8-
import { validOooStatusRequests, validOooStatusUpdate } from "../../fixtures/oooRequest/oooRequest";
9+
import { acknowledgeOooRequest, validOooStatusRequests, validOooStatusUpdate } from "../../fixtures/oooRequest/oooRequest";
910

1011
describe("OOO Status Request Validators", function () {
1112
let req: any;
@@ -89,4 +90,33 @@ describe("OOO Status Request Validators", function () {
8990
}
9091
});
9192
});
93+
94+
describe("acknowledgeOOORequestsValidator", function () {
95+
it("should not validate for an invalid request if request type is passed", async function () {
96+
req = {
97+
body: { ...acknowledgeOooRequest, type: "OOO"}
98+
};
99+
100+
await acknowledgeOOORequestsValidator(req, res, nextSpy);
101+
expect(nextSpy.notCalled).to.be.true;
102+
});
103+
104+
it("should not validate for an invalid request if status is incorrect", async function () {
105+
req = {
106+
body: { ...acknowledgeOooRequest, status: "PENDING"}
107+
};
108+
109+
await acknowledgeOOORequestsValidator(req, res, nextSpy);
110+
expect(nextSpy.notCalled).to.be.true;
111+
});
112+
113+
it("should validate for a valid acknowledge OOO request", async function() {
114+
req = {
115+
body: acknowledgeOooRequest
116+
};
117+
res = {};
118+
await acknowledgeOOORequestsValidator(req, res, nextSpy);
119+
expect(nextSpy.calledOnce).to.be.true;
120+
});
121+
});
92122
});

0 commit comments

Comments
 (0)