Skip to content

Commit f25bb2a

Browse files
surajmaity1pankajjs
authored andcommitted
feat: Add test cases for PATCH /requests/:id API for acknowledging OOO requests (#2391)
* feat: add tests for PATCH OOO request * feat: add tests for PATCH OOO request * fix: skip test cases * fix: test case * fix: test skipped
1 parent 2916b1f commit f25bb2a

File tree

4 files changed

+399
-5
lines changed

4 files changed

+399
-5
lines changed

test/fixtures/oooRequest/oooRequest.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,19 @@ export const updateOooStatusRequest = [
157157
updatedAt: 1234567890,
158158
reason: "Approval granted.",
159159
},
160-
];
160+
];
161+
162+
export const createOooRequests3 = {
163+
from: Date.now() + 100000,
164+
until: Date.now() + 200000,
165+
type: "OOO",
166+
requestedBy: "suraj-maity-1",
167+
reason: "Out of office for personal emergency.",
168+
status: REQUEST_STATE.PENDING
169+
};
170+
171+
export const acknowledgeOooRequest = {
172+
type: REQUEST_TYPE.OOO,
173+
status: REQUEST_STATE.APPROVED,
174+
comment: "OOO request approved as it's emergency."
175+
};

test/integration/requests.test.ts

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {
1515
validOooStatusRequests,
1616
validOooStatusUpdate,
1717
createOooRequests2,
18+
acknowledgeOooRequest,
19+
createOooRequests3,
1820
} from "../fixtures/oooRequest/oooRequest";
1921
import { createRequest, updateRequest } from "../../models/requests";
2022
import {
@@ -27,6 +29,8 @@ import {
2729
REQUEST_ALREADY_PENDING,
2830
REQUEST_REJECTED_SUCCESSFULLY,
2931
REQUEST_ALREADY_REJECTED,
32+
INVALID_REQUEST_TYPE,
33+
// UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST,
3034
UNAUTHORIZED_TO_CREATE_OOO_REQUEST,
3135
USER_STATUS_NOT_FOUND,
3236
OOO_STATUS_ALREADY_EXIST,
@@ -36,6 +40,7 @@ import { validTaskAssignmentRequest, validTaskCreqtionRequest } from "../fixture
3640
import { deleteUserStatus, updateUserStatus } from "../../models/userStatus";
3741
import * as requestsQuery from "../../models/requests";
3842
import { userState } from "../../constants/userStatus";
43+
import * as logUtils from "../../services/logService";
3944

4045
const userData = userDataFixture();
4146
chai.use(chaiHttp);
@@ -48,6 +53,7 @@ let approvedOooRequestId: string;
4853
let oooRequestData: any;
4954
let oooRequestData2: any;
5055
let testUserId: string;
56+
let testSuperUserId: string;
5157
let testArchivedUserId: string;
5258

5359
describe("/requests OOO", function () {
@@ -58,6 +64,7 @@ describe("/requests OOO", function () {
5864
const userIdPromises = [addUser(userData[16]), addUser(userData[4]), addUser(userData[18])];
5965
const [userId, superUserId, archivedUserId] = await Promise.all(userIdPromises);
6066
testUserId = userId;
67+
testSuperUserId = superUserId;
6168
testArchivedUserId = archivedUserId;
6269

6370
oooRequestData = { ...createOooRequests, requestedBy: userId };
@@ -316,6 +323,189 @@ describe("/requests OOO", function () {
316323
});
317324
});
318325

326+
describe.skip("PATCH /requests/:id", function () {
327+
let testOooRequest;
328+
let onboardingRequest;
329+
let approvedOooRequest;
330+
let rejectedOooRequest;
331+
332+
beforeEach(async function () {
333+
334+
oooRequestData = { ...createOooRequests3, userId: testUserId };
335+
testOooRequest = await createRequest(oooRequestData);
336+
337+
onboardingRequest = await createRequest({
338+
type: REQUEST_TYPE.ONBOARDING,
339+
numberOfDays: 5,
340+
reason: "This is the reason",
341+
userId: testUserId,
342+
});
343+
344+
const pendingOooRequest1 = await createRequest(oooRequestData);
345+
approvedOooRequest = await updateRequest(pendingOooRequest1.id, { status: REQUEST_STATE.APPROVED }, testSuperUserId, REQUEST_TYPE.OOO);
346+
347+
const pendingOooRequest2 = await createRequest(oooRequestData);
348+
rejectedOooRequest = await updateRequest(pendingOooRequest2.id, { status: REQUEST_STATE.REJECTED }, testSuperUserId, REQUEST_TYPE.OOO);
349+
});
350+
351+
it("should return 401 if user is not logged in", function (done) {
352+
chai
353+
.request(app)
354+
.patch(`/requests/${testOooRequest.id}?dev=true`)
355+
.send(acknowledgeOooRequest)
356+
.end(function (err, res) {
357+
expect(res).to.have.status(401);
358+
expect(res.body.error).to.equal("Unauthorized");
359+
expect(res.body.message).to.equal("Unauthenticated User");
360+
done();
361+
});
362+
});
363+
364+
it("should return 501 and 'Feature not implemented' message when dev is false", function (done) {
365+
chai
366+
.request(app)
367+
.patch(`/requests/${testOooRequest.id}?dev=false`)
368+
.set("cookie", `${cookieName}=${superUserToken}`)
369+
.send(acknowledgeOooRequest)
370+
.end(function (err, res) {
371+
if (err) {
372+
return done(err);
373+
}
374+
expect(res.statusCode).to.equal(501);
375+
expect(res.body.message).to.equal("Feature not implemented");
376+
done();
377+
});
378+
});
379+
380+
it("should return 404 if request does not exist", function (done) {
381+
chai
382+
.request(app)
383+
.patch(`/requests/11111111111111?dev=true`)
384+
.set("cookie", `${cookieName}=${superUserToken}`)
385+
.send(acknowledgeOooRequest)
386+
.end(function (err, res) {
387+
if (err) {
388+
return done(err);
389+
}
390+
expect(res.statusCode).to.equal(404);
391+
expect(res.body.message).to.equal(REQUEST_DOES_NOT_EXIST);
392+
done();
393+
});
394+
});
395+
396+
it("should return 403 if user does not have super user permission", function (done) {
397+
chai
398+
.request(app)
399+
.patch(`/requests/${testOooRequest.id}?dev=true`)
400+
.set("cookie", `${cookieName}=${authToken}`)
401+
.send(acknowledgeOooRequest)
402+
.end(function (err, res) {
403+
if (err) {
404+
return done(err);
405+
}
406+
expect(res.statusCode).to.equal(403);
407+
// expect(res.body.message).to.equal(UNAUTHORIZED_TO_ACKNOWLEDGE_OOO_REQUEST);
408+
done();
409+
});
410+
});
411+
412+
it("should return 409 if OOO request is already approved", function (done) {
413+
chai
414+
.request(app)
415+
.patch(`/requests/${approvedOooRequest.id}?dev=true`)
416+
.set("cookie", `${cookieName}=${superUserToken}`)
417+
.send(acknowledgeOooRequest)
418+
.end(function (err, res) {
419+
if (err) {
420+
return done(err);
421+
}
422+
expect(res.statusCode).to.equal(409);
423+
expect(res.body.message).to.equal(REQUEST_ALREADY_APPROVED);
424+
done();
425+
});
426+
});
427+
428+
it("should return 409 if OOO request is already rejected", function (done) {
429+
chai
430+
.request(app)
431+
.patch(`/requests/${rejectedOooRequest.id}?dev=true`)
432+
.set("cookie", `${cookieName}=${superUserToken}`)
433+
.send(acknowledgeOooRequest)
434+
.end(function (err, res) {
435+
if (err) {
436+
return done(err);
437+
}
438+
expect(res.statusCode).to.equal(409);
439+
expect(res.body.message).to.equal(REQUEST_ALREADY_REJECTED);
440+
done();
441+
});
442+
});
443+
444+
it("should return 400 when the request type for the given ID is not 'OOO'", function (done) {
445+
chai
446+
.request(app)
447+
.patch(`/requests/${onboardingRequest.id}?dev=true`)
448+
.set("cookie", `${cookieName}=${superUserToken}`)
449+
.send(acknowledgeOooRequest)
450+
.end(function (err, res) {
451+
if (err) {
452+
return done(err);
453+
}
454+
expect(res.statusCode).to.equal(400);
455+
expect(res.body.message).to.equal(INVALID_REQUEST_TYPE);
456+
done();
457+
});
458+
});
459+
460+
it("should approve OOO request when dev is true", function (done) {
461+
chai
462+
.request(app)
463+
.patch(`/requests/${testOooRequest.id}?dev=true`)
464+
.set("cookie", `${cookieName}=${superUserToken}`)
465+
.send(acknowledgeOooRequest)
466+
.end(function (err, res) {
467+
if (err) {
468+
return done(err);
469+
}
470+
expect(res.statusCode).to.equal(200);
471+
expect(res.body.message).to.equal(REQUEST_APPROVED_SUCCESSFULLY);
472+
done();
473+
});
474+
});
475+
476+
it("should reject OOO request when dev is true", function (done) {
477+
chai
478+
.request(app)
479+
.patch(`/requests/${testOooRequest.id}?dev=true`)
480+
.set("cookie", `${cookieName}=${superUserToken}`)
481+
.send({...acknowledgeOooRequest, status: REQUEST_STATE.REJECTED})
482+
.end(function (err, res) {
483+
if (err) {
484+
return done(err);
485+
}
486+
expect(res.statusCode).to.equal(200);
487+
expect(res.body.message).to.equal(REQUEST_REJECTED_SUCCESSFULLY);
488+
done();
489+
});
490+
});
491+
492+
it("should return 500 response for unexpected error", function (done) {
493+
sinon.stub(logUtils, "addLog").throws("Error");
494+
chai
495+
.request(app)
496+
.patch(`/requests/${testOooRequest.id}?dev=true`)
497+
.set("cookie", `${cookieName}=${superUserToken}`)
498+
.send(acknowledgeOooRequest)
499+
.end(function (err, res) {
500+
if (err) return done(err);
501+
expect(res.statusCode).to.equal(500);
502+
expect(res.body.error).to.equal("Internal Server Error");
503+
expect(res.body.message).to.equal("An internal server error occurred");
504+
done();
505+
});
506+
});
507+
});
508+
319509
describe("PUT /requests/:id", function () {
320510
it("should return 401 if user is not logged in", function (done) {
321511
chai

test/unit/middlewares/oooRequests.test.ts

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ const { expect } = chai;
44

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

1012
describe("OOO Status Request Validators", function () {
1113
let req: any;
@@ -88,4 +90,42 @@ describe("OOO Status Request Validators", function () {
8890
}
8991
});
9092
});
91-
});
93+
94+
describe.skip("acknowledgeOOORequestsValidator", function () {
95+
it("should not validate for an invalid request for invalid request type", async function () {
96+
req = {
97+
body: { ...acknowledgeOooRequest, type: "XYZ"}
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 if comment not provided by superusers", async function() {
114+
req = {
115+
body: _.omit(acknowledgeOooRequest, "comment")
116+
};
117+
res = {};
118+
// await acknowledgeOOORequestsValidator(req, res, nextSpy);
119+
expect(nextSpy.calledOnce).to.be.true;
120+
});
121+
122+
it("should validate for a valid acknowledge OOO request", async function() {
123+
req = {
124+
body: acknowledgeOooRequest
125+
};
126+
res = {};
127+
// await acknowledgeOOORequestsValidator(req, res, nextSpy);
128+
expect(nextSpy.calledOnce).to.be.true;
129+
});
130+
});
131+
});

0 commit comments

Comments
 (0)